EF Core支持多种主键生成策略:自动增长;GUID;HI/Lo算法等。
自增主键
1、优点:简单
2、缺点:数据库迁移以及分布式系统中比较麻烦,并发性能差
3、short int long类型主键默认自增
4、SaveChanges后会自动把主键的值更新到Id属性。例如:插入帖子后,自动重定向帖子地址
5、自增字段的代码中不能为Id赋值,必须保持默认值0,否则运行报错
6、自增的值是由数据库生成,而非EF Core或手动。
Guid算法
1、优点:简单、高并发、全局唯一、适用分布式系统、多数据库合并时很简单
2、缺点:磁盘空间占用大。
3、生成全局唯一的Id
4、Guid值不连续,使用Guid类型做主键的时候,不能把主键设置为聚集索引。因为聚集索引是按照顺序保存主键的,因此用Guid做主键性能查。Mysql的InnoDB引擎中主键是强制使用聚集索引。有的数据库支持部分的 连续Guid,比如SQL SERVER中的NewSequentialId(),但是也不能解决问题。在Sql Server等中不用把Guid主键设置为聚集索引;在Mysql中,插入频繁的表不要使用Guid做主键。
5、实体类设置Guid类型主键。
//设置Guid类型的主键
public Guid Id { get; set; }
6、对需要存入数据库的实体类类型的变量,如果提手动赋值一个Guid值,那么EF CORE就会使用提前手动设置的Guid值存入数据库,如果没有提前手动赋值EF Core会自动生成一个Guid值。建议使用手动赋值Guid方法。
混合主键
混合自增和Guid(非复合主键)。用自增列做物理的主键,而用Guid列用逻辑上的主键。把自增列设为表的主键,而在业务上查询数据时候把Guid当主键用。在和其他表关联关联以及和外部系统通讯的时候(比如前端显示数据的标识的时候)都是使用Guid列。保证了性能,利用了Guid的优点,减轻了主键自增性导致主键值可被预测带来的安全性问题。
Hi/Lo算法
主键由高位(Hi)和低位(Lo)组成,高位由数据库生成,两个高位之间间隔若干值,低位由本地程序自增生成。不同进程或者集群中不同服务器获取的Hi值不会重复,而本地进程计算的Lo则可以保证可以在本地高效率的生成主键值。但是HiLo算法不是EF Core的标准。