EF Code First - 如何设置身份种子?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EF Code First - 如何设置身份种子?相关的知识,希望对你有一定的参考价值。

我有一个实体类

public class Employee
{
    public long Id { get; set; }
    public string Name { get; set; }
}

我已将Id字段设置为具有自动编号生成的主键

modelBuilder.Entity<Employee>().HasKey(e => e.Id);
modelBuilder.Entity<Employee>().Property(e => e.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

但我希望Identity从10000而不是从1开始播种,这是默认值。如何在EF中指定?

答案

如果您使用的是SQL Server,则必须创建自定义数据库初始化程序并手动执行DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)。要使用自定义SQL命令创建和使用自定义初始化程序,请检查this answer

另一答案

根据Ladislav Mrnka的回答,您可以在迁移文件Up方法中添加:

Sql("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
另一答案

基于@ ehsan88,您可以创建Database Initialize类

 public class AccDatabaseInitializer : CreateDatabaseIfNotExists<YourContect>
    {
      protected override void Seed(YourContect context)
       {
          context.Database.ExecuteSqlCommand("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");
           context.SaveChanges();
       }
    }

谢谢

另一答案

通过从Up方法迁移脚本执行“DBCC CHECKIDENT('TableName',RESEED,NewSeedValue)”脚本,您可以无限制地获得与身份种子为1000相同的输出。

但是,SQL Server中的表定义仍然显示“IDENTITY(1,1)”,即使在表中输入的第一个记录获得id 1000.这意味着表的标识种子实际上没有设置为1000。这只是在创建第一条记录时消耗或跳过了初始的999值,当然因为您正在向DB发出RESEED命令,即您正在更改已设置的SEED。

总而言之,在EF核心v2.1中,Microsoft似乎没有提供在创建表时自定义标识种子值的规定。让我们希望EF Core的未来版本,可能是2.2或3.0将具有此功能。思考......?

以上是关于EF Code First - 如何设置身份种子?的主要内容,如果未能解决你的问题,请参考以下文章

EF Code-First 中的种子方法

8天掌握EF的Code First开发系列之3 管理数据库创建,填充种子数据以及LINQ操作详解

如何将时态表添加到 EF Code-First DBContext?

EF Code First Database Initializer和Migrations Confusion

EF Code-First 学习之旅

EF,Code First - 如何在插入时设置自定义Guid标识值