【问题标题】:How to control primary key values when seeding data with Entity Framework codefirst首先使用实体​​框架代码播种数据时如何控制主键值
【发布时间】:2012-10-03 08:22:17
【问题描述】:

我正在使用实体框架 5 和 codefirst 和 sql server express 2012 创建一个 asp.net mvc4 站点。

我已启用迁移,现在在我的 Configuration.Seed 方法中执行此操作: (请注意,我想将主键设置为 8,即使这是数据库中的第一条记录)。

context.ProductCategoryDtoes.AddOrUpdate(x => x.Id,
    new ProductCategoryDto() { Id = 8, Name = "category1" }
);

我的模型对象是这样定义的:

[Table("ProductCategory")]
public class ProductCategoryDto {
    public long Id { get; set; }
    public string Name { get; set; }
}

这会在 (SQL SERVER EXPRESS 2012) 中生成一个表,其中 Id 列的 Identity = true、Identity seed = 1、identity increment = 1。

现在,当我通过 PM> Update-Database 运行迁移时,这会导致 Id = 1 的一行。

所以我的问题是:

1) 播种数据时如何控制自增主键的值。

2) 如果解决方案是增加键列种子值,那么当我使用Database.SetInitializer(new DropCreateDatabaseAlways<MyContext>()); 时如何做到这一点。这将在我每次更新数据库时核对并重建数据库,那么如何在新数据库中更新种子值?

【问题讨论】:

    标签: sql-server entity-framework ef-code-first entity-framework-migrations


    【解决方案1】:

    只需使用默认值创建虚拟实体,然后添加您的真实数据,然后删除虚拟实体。不是最好的方法,但我想没有其他方法......

    【讨论】:

      【解决方案2】:

      您是否尝试将其添加到您的 Id 属性之上:

      [DatabaseGenerated(DatabaseGeneratedOption.None)]
      public long Id { get; set; }
      

      【讨论】:

      • 不,但这对我没有帮助,因为我仍然想使用身份(自动增量),我只想从 0 以外的另一个种子开始。
      【解决方案3】:

      您似乎试图破坏身份列的目的。如果你想这样做,你唯一的选择是使用 SQL 命令Set IDENTITY_INSERT 来允许你插入值,然后运行DBCC CHECKIDENT 来更新种子。这不是一个好主意。这些选项具有安全性和性能限制。

      您可能需要考虑改用 GUID。您可以在保证唯一的代码中创建 GUID,也可以在 SQL 中生成 GUID 作为列默认值。

      对于非连续的 GUID,您需要考虑一个好的索引策略。这种方法也值得商榷。

      最终,除了使用标识列之外,您似乎需要一种不同的策略。

      【讨论】:

      • 我想控制Id,因为我正在将数据从MySql数据库迁移到Sql Server
      【解决方案4】:

      这是非常骇人听闻的,但我遇到了一种情况,由于一些报告具有硬编码的 PK 值,我不得不这样做。修复报告超出了我的工作范围。

      Context.Database.ExecuteSqlCommand("SET IDENTITY_INSERT dbo.ProductCategoryDto ON " +
           "INSERT INTO dbo.ProductCategoryDto (Id, Name) VALUES (8, 'category1') " +
           "SET IDENTITY_INSERT dbo.ProductCategoryDto OFF");
      

      【讨论】:

        猜你喜欢
        • 2015-09-02
        • 1970-01-01
        • 1970-01-01
        • 2011-11-07
        • 1970-01-01
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多