【问题标题】:EF Code First - how to set identity seed?EF Code First - 如何设置身份种子?
【发布时间】:2011-08-23 21:23:53
【问题描述】:

我有一个实体类

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);

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

【问题讨论】:

  • 创建表时必须指定
  • @LIghtWing EF 代码首先自动为您创建表格。问题是如何让 EF 在创建表时为您设置种子值,而不是如何手动设置。
  • 哦,你想要 EF 创建你的表。我明白了。
  • 这有点害虫,不是吗。希望在某个时候,您可以将种子值指定为 HasDatabaseGeneratedOption 方法的重载,而不必跳出原本非常好的框架。

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


【解决方案1】:

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

【讨论】:

  • 代码优先,数据库特定 SQL 最后 ;)
  • 代码优先是基于您对数据库完全没有要求的事实。如果您有要求,则必须引入特定于数据库的 SQL。
  • 如果你把它放在播种机中,播种机将在每次初始化时运行。然后,除非您手动计算,否则您每次都会重置该值。这会导致您的下一个 INSERT 出现约束错误。
【解决方案2】:

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

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

【讨论】:

  • 感谢您提供仅使用 VS 而不是需要更多部署工作的 SQL Server 的解决方案。
  • 恕我直言-这应该是公认的答案。这是更“代码优先”的方式。将所有数据库构建逻辑放入迁移中,这样当您在几天/几周/几个月后重建数据库时就不会忘记任何事情。
  • 迁移更容易,因为它只会运行一次。如果您不小心为该列多次播种(例如,将其放入数据播种器/初始化程序而不是迁移),您将在下一个 INSERT 时遇到 ID 冲突。
【解决方案3】:

基于@ehsan88,您可以创建一个数据库初始化类

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

谢谢

【讨论】:

    【解决方案4】:

    您可以通过在迁移脚本的 Up 方法中执行“DBCC CHECKIDENT ('TableName', RESEED, NewSeedValue)”脚本来明确实现与身份种子为 1000 相同的输出。

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

    总之,看起来,在 EF core v2.1 中,微软没有提供在创建表时自定义标识种子值的规定。让我们希望 EF Core 的未来版本,可能是 2.2 或 3.0 将具有此功能。 想法...?

    【讨论】:

      猜你喜欢
      • 2016-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      • 2014-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多