使用Identity列时能否指定序列起始值?如何组合对应代码实现?
关于Identity列与自定义序列的配置问题
1. 使用Identity列时,能否指定序列起始值?
当然可以!默认情况下,PostgreSQL会为Identity列自动创建一个系统命名的序列(格式通常是表名_列名_seq),起始值默认为1。但我们完全可以通过自定义序列并将其关联到Identity列的方式,来指定自己想要的起始值——不管是从1000开始还是其他数值,都能灵活控制。
2. 如何组合自定义序列配置与modelBuilder.ForNpgsqlUseIdentityColumns()?
modelBuilder.ForNpgsqlUseIdentityColumns()是用来全局设置EF Core默认使用PostgreSQL的Identity列作为主键生成策略的。如果要同时使用你定义的OrderNumbers序列,只需要在全局配置的基础上,单独为目标实体的列关联这个自定义序列即可,两者完全兼容。
下面是完整的配置示例:
protected override void OnModelCreating(ModelBuilder modelBuilder) { // 全局配置:让所有未单独配置的实体默认使用Identity列作为主键生成策略 modelBuilder.ForNpgsqlUseIdentityColumns(); // 定义自定义序列:起始值1000,归属shared schema modelBuilder.HasSequence<int>("OrderNumbers", schema: "shared") .StartsAt(1000) .IncrementsBy(1); // 可选参数,默认增量就是1,明确写出更直观 // 将自定义序列绑定到特定实体的目标列上 modelBuilder.Entity<Order>() .Property(order => order.OrderId) // 指定该Identity列使用我们自定义的OrderNumbers序列 .ForNpgsqlHasIdentitySequence("OrderNumbers", "shared"); }
补充说明:
- 全局的
ForNpgsqlUseIdentityColumns()保证了其他没有单独配置的实体列依然沿用默认的Identity策略; - 单独为
Order.OrderId配置ForNpgsqlHasIdentitySequence()会覆盖该列的默认序列,改用你自定义的规则; - 如果你的需求是采用HiLo算法生成主键而非直接的Identity关联,也可以把最后一行替换成
.ForNpgsqlUseSequenceHiLo("OrderNumbers", "shared"),根据实际业务场景选择即可。
内容的提问来源于stack exchange,提问作者Avin Kavish
相关产品推荐
相关产品推荐

