6

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

4

4 回答 4

2

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

于 2012-10-05T07:46:13.207 回答
1

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

[DatabaseGenerated(DatabaseGeneratedOption.None)]
public long Id { get; set; }
于 2012-10-04T01:52:37.420 回答
0

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

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

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

最终,看起来您需要一种不同的策略,而不是使用身份列。

于 2012-10-03T10:58:25.480 回答
0

这是非常骇人听闻的,但我遇到了一种情况,由于一些报告具有硬编码的 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");
于 2013-12-23T12:30:19.473 回答