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

时间:2011-05-12 07:13:26

标签: c# .net ef-code-first entity-framework-4.1

我有一个实体类

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中指定它?

4 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:15)

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

Sql("DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)");

答案 2 :(得分:0)

基于@ ehsan88,您可以制作数据库初始化类

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

谢谢

答案 3 :(得分:0)

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

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

最后,在EF core v2.1中,Microsoft似乎没有提供在创建表时自定义身份种子值的规定。让我们希望,未来的EF Core版本(可能为2.2或3.0)将具有此功能。 有想法...吗?