杨中科 EFCORE 第三部分 主键

主键

自增主键

1、EF Core支持多种主键生成策略:自动增长;Guid;Hi/Lo算法等。
2、自动增长。
优点:简单;
缺点: 数据库迁移以及分布式系统中(多数据库合并,会有重复主键值)比较麻烦;并发性能差(大并发情况下,为了保证自增且不重复,会加锁)。
long、int等类型主键,默认是自增。因为是数据库生成的值,所以SaveChanges后会自动把主键的值更新到Id属性。试验一下。场景: 插入帖子后,自动重定向帖子地址。
3、自增字段的代码中不能为Id赋值,必须保持默认值0.否则运行的时候就会报错

示例:SaveChanges后会自动把主键的值更新到Id属性

在这里插入图片描述
在这里插入图片描述

为主键指定值会报错
在这里插入图片描述

Guid主键

1、Guid算法 (或UUID算法) 生成一个全局唯一的Id。适合于分布式系统,在进行多数据库数据合并的时候很简单。优点:简单,高并发全局唯一;缺点: 磁盘空间占用大。
2、Guid值不连续。使用Guid类型做主键的时候,不能把主键设置为聚集索引。因为聚集索引是按照顺序保存主键的,因此用Guid做主键性能差。比如MySQL的InnoDB引警中主键是强制使用聚集索引的。有的数据库支持部分的连续Guid,比如SOLServer中的NewSeguentialId(),但也不能解决问题。在SQLServer等中,不要把Guid主键设置为聚集索引; 在MySQL中,插入频繁的表不要用Guid做主键。
3、演示Guid用法:既可以让EF Core给赋值,也可以手动赋值 (推荐)

示例:
在这里插入图片描述
运行多次,每次生成的数据都不同
在这里插入图片描述

guid 使用示例

1.新建 Rabbit 类
在这里插入图片描述
在DbContext中 配置
在这里插入图片描述

命令执行

在这里插入图片描述
在这里插入图片描述

结果:

在这里插入图片描述

插入数据
默认方式:

在这里插入图片描述

运行结果:

在这里插入图片描述

手动方式

在这里插入图片描述

其他方案

1、混合自增和Guid(非复合主键) 。用自增列做物理的主键,而用Guid列做逻辑上的主键。把自增列设置为表的主键,而在业务上查询数据时候把Guid当主键用。在和其他表关联以及和外部系统通讯的时候(比如前端显示数据的标识的时候)都是使用Guid列。不仅保证了性能,而且利用了Guid的优点,而且减轻了主键自增性导致主键值可被预测带来的安全性问题(别人通过某一个数据,能预测到后面的数据。爬取你的数据)。
2、Hi/Lo算法:EF Core支持Hi/Lo算法来优化自增列。主键值由两部分组成:高位 (Hi) 和低位 (Lo),高位由数据库生成,两个高位之间间隔若千个值,由程序在本地生成低位,低位的值在本地自增生成。不同进程或者集群中不同服务器获取的Hi值不会重复,而本地进程计算的Lo则可以保证可以在本地高效率的生成主键值。但是HiLo算法不是EF Core的标准

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/319785.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode: 57. 插入区间+分类讨论+模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

NLP论文阅读记录 - WOS | ROUGE-SEM:使用ROUGE结合语义更好地评估摘要

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结 前言 ROUGE-SEM: Better evaluation of summarization using ROUGE combin…

ssh 远程登录协议

一、SSH 服务 1.1 SSH 基础 SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应…

STM8入门|第一个工程

开发软件 不支持Keil,使用IAR for STM8,注意 IAR系列有很多种 STM8对应软件是 IAR for STM8 软件下载: 官网下载地址,官网版本下载比较麻烦,可以按教程网盘地址下载。 下载安装教程: https://www.cnblogs…

Compileflow工作流引擎使用讲解

文章目录 1 Compileflow1.1 简介1.2 特点1.3 Compileflow插件下载1.4 main方法调用1.4.1 pom.xml1.4.2 新建bpm文件1.4.3 各个节点绑定方法1.4.4 测试方法 1.5 bpm各个标签说明1.5.1 BPM根节点1.5.2 全局变量1.5.3 开始节点: start1.5.4 结束节点: end1.5.5 自动节点: autoTask…

B-TREE(B-树)

B-TREE B-tree 又叫平衡多路查找树。一棵 m 阶的 B-tree (m 叉树)的特性如下(其中 ceil(x)是一个取上限的函数): 树中每个结点至多有 m 个孩子; 除根结点和叶子结点外,其它每个结点至少有有 ceil(m / 2)个孩子&#…

JVM实战(13)——JVM优化概述

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖&…

每日一题——LeetCode1128.等价多米诺骨牌对的数量

先尝试暴力解法&#xff1a; var numEquivDominoPairs function(dominoes) {var count0for(let i0;i<dominoes.length-1;i){for(let ji1;j<dominoes.length;j){if((dominoes[i][0]dominoes[j][0] && dominoes[i][1]dominoes[j][1]) || (dominoes[i][0]dominoes…

Qt/QML编程学习之心得:小键盘keyboard(36)

小键盘对于qml应用是经常用到的,在qml里面,就如一个fileDialog也要自己画一样,小键盘keyboard也是要自己画的,对于相应的每个按键的clicked都要一一实现的。 这里有一个示例: 代码如下: import QtQuick 2.5 import QtQuick.Controls 1.4 import QtQuick.Window 2.0 im…

Redis面试篇

redis面试题主要内容 面试官在面试时主要会问以下这些方面的问题 下面是一些问题示例&#xff1a; redis-使用场景 缓存 缓存穿透 介绍 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;mysql查询不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都会去查数…

2.1 常用计算机网络体系结构

2.1 常用计算机网络体系结构 2.1.1 OSI体系结构 1、为了使不同体系结构的计算机网络都能够互联&#xff0c;国际标准化组织于1977年成立了专门机构研究该问题&#xff0c;不久他们就提出了一个试图使各种计算机在世界范围内都能够互连成网的标准框架&#xff0c;也就是著名的…

Redis命令 - Lists命令组常用命令

先创建一个 key 叫做 mylist&#xff0c;mylist存一个list。 list数据类型底层是一个链表。先进后出&#xff0c;后进先出。 命令中的L&#xff08;Left&#xff09;、R&#xff08;Right&#xff09;代表链表的头部L&#xff08;下标0的位置&#xff09;和尾部R&#xff08;…

mysql5.7之从入门到放弃

系列文章目录 第一章 MySQL5.7之从入门到放弃 第二章 MySQL从入门到放弃之数据库体系结构与管理 第三章 MySQL基础应用之DDL、DCL、DML、DQL 文章目录 系列文章目录前言一、Mysql的介绍和安装&#xff1f;1、什么是数据&#xff1f;2、什么是数据库管理系统&#xff08;DBMS&a…

基于深度学习的老照片修复系统

技术栈 深度学习 pytorch tensorflow python 卷积神经 神经网络 照片修复 vue 老照片修复 扫描褪色 残损照片或胶片 调整暗调/高光以改善面效果 修正曝光斑痕 背景&#xff1a; 随着时间的流逝&#xff0c;许多老照片可能会褪色、损坏或曝光不当。这些老照片记录了宝贵的回忆…

如何在Windows 11的桌面中添加此电脑图标,这里提供四种方法

将“此电脑”图标添加到Windows 11桌面,使文件更容易访问。虽然Window的11酷设计从一开始就没有包含这个图标,但没必要担心。取回它很容易。你可以通过“设置”菜单、快捷方式或使用“控制面板”再次返回。有几种方法可以恢复此图标。 在这篇文章中,我们将探讨不同的方法,…

Windows下使用clion调试LevelDB与rocksdb

目录 关于leveldb下载leveldb源码增加测试文件更新cmake文件运行 关于RocksDB下载RocksDB代码修改CMakelist.txt运行 参考资料&#xff1a; 关于leveldb 下载leveldb源码 链接: leveldbGit地址 增加测试文件 使用clion打开项目&#xff0c;在根目录下新建一个app目录&#…

超详细的嵌入式cJSON使用注意事项,持续补充中......

文章目录 一、堆内存不足1.1 问题描述1.2 解决办法 二、内存泄露2.1 忘记Delete2.2 忘记Free2.3 串口数据接收缺少部分字符导致的内存泄露(自己的问题)问题分析 2.4 内存泄露在Cortex-M3内核会发生什么&#xff1f; cJSON开源库地址&#xff1a; cJSON 一、堆内存不足 1.1 问…

第十二讲 单片机驱动彩色液晶屏 如何打包bin档

单片机驱动TFT彩色液晶屏系列讲座 目录 第一讲 单片机最小系统STM32F103C6T6通过RA8889驱动彩色液晶屏播放视频 第二讲 单片机最小系统STM32F103C6T6控制RA8889驱动彩色液晶屏硬件框架 第三讲 单片机驱动彩色液晶屏 控制RA8889软件:如何初始化 第四讲 单片机驱动彩色液晶屏 控…

Python-- if...else

在 Python 中&#xff0c;if 语句是用来进行条件判断的基本结构。它允许您根据一个或多个条件的真假来执行不同的代码块。Python 的 if 语句的基本语法如下&#xff1a; if condition:# do something elif another_condition:# do something else else:# do something if none…

【Linux】线程池实现

&#x1f4d7;线程池实现&#xff08;单例模式&#xff09; 1️⃣线程池概念2️⃣线程池代码样例3️⃣部分问题与细节&#x1f538;类成员函数参数列表中隐含的this指针&#x1f538;单例模式&#x1f538;一个失误导致的bug 4️⃣调用线程池完成任务 1️⃣线程池概念 线程池是…