使用EF代码优先和迁移的显式ID值

时间:2013-08-22 07:01:24

标签: c# asp.net-mvc entity-framework code-first ef-migrations

我使用EF Code-first开发我的ASP.NET MVC4应用程序,我也使用迁移功能。我有特定的实体,我想出于某些原因设置显式的id值。我怎样才能做到这一点?我试图用这样的属性标记id属性:

public class NewsSource
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    public string Title { get; set; }

    public string WebSiteUrl { get; set; }
}

然后我添加相应的迁移,删除数据库并尝试使用Seed()方法更新数据库,如下所示:

context.NewsSources.AddOrUpdate(x => x.Title,
            new NewsSource {Id = 654, Title = "ABC", WebSiteUrl = @"http://www.abc.com/"},
            new NewsSource {Id = 22, Title = "XYZ", WebSiteUrl = @"http://XYZ.ru/"});

我得到了这个错误:“当IDENTITY_INSERT设置为OFF时,无法在表'NewsSources'中为标识列插入显式值”。如何使用EF和迁移将identity_insert设置为ON。正如我从许多主题中理解的那样,它是不可能的,我必须使用直接的SQL命令。我错了吗?

2 个答案:

答案 0 :(得分:1)

当我尝试将列更改为IDENTITY字段(原来不是标识字段)时,我遇到了问题。 See this questionthis one。您必须删除该列并将其重新创建为remove IDENTITY,因此修复外键等可能是Entity Framework在迁移过程中所做的一个步骤。您必须自己更改Up()和Down()方法,否则您可能无法在数据库中执行此操作。

答案 1 :(得分:0)

如果删除DatabaseGenerated属性并保留[Key]属性,会发生什么?

public class NewsSource
{
    [Key]
    public int Id { get; set; }
    public string Title { get; set; }
    public string WebSiteUrl { get; set; }
}

我在这个问题上遇到了一段时间,我相信这对我来说是个不错的选择。我现在无法测试,因为我没有任何项目在我面前,其中有EF。我所能说的只是EF代码,而nuget迁移包是一件很棒的事情,如果你按照你应该对待它的方式对待它。当我们将两者结合使用并尝试种植复杂的相关模型时,我已经进入了许多WTF时刻。祝你好运!