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時刻。祝你好運!