我正在使用实体框架 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>());. 。每次更新数据库时,这都会破坏并重建数据库,那么种子值如何在新数据库中更新?

有帮助吗?

解决方案

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

其他提示

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

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

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

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

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

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

这是非常hackish的,但我遇到了一个场景,由于一些报告具有硬编码的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");
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top