0

我使用EF代码优先开发我的ASP.NET MVC4应用程序,同样使用迁移功能。我有特定的实体,我想设置显式的id值由于某些原因。我怎样才能做到这一点?我试着用这样的属性标记id属性:使用EF代码优先和迁移的明确ID值

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

    public string Title { get; set; } 

    public string WebSiteUrl { get; set; } 
} 

然后,添加相应的迁移,删除数据库,并尝试使用种子()方法,这样来更新数据库:

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/"}); 

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

+0

我认为你没有错。只要你把'[Key]'注释掉了,EF就会想要通过它自己来处理这个ID。也许你应该为你的桌子考虑另一种结构。 我可能有错,但我的研究给了我和你一样的结果:这是不可能的。 – Atlasmaybe

回答

1

当我尝试将列更改为IDENTITY字段时,出现了问题,当它最初不是标识字段时。 See this questionthis one。您必须删除该列并将其重新创建为remove IDENTITY,因此修复外键等可能是实体框架在迁移过程中执行得太过分了。你将不得不自己修改Up()和Down()方法,否则你可能会在数据库中做这件事。

+0

我刚刚也被这个咬了... DropColumn(“Customer”,“CustomerId”); AddColumn(“Customer”,“CustomerId”,c => c.Long(可为空,false,身份:false)); 解决了它! –

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 migrations包是一件好事。在将两者结合在一起并试图种植复杂的相关模型时,我已经进入了许多WTF时刻。祝你好运!