7

我已經在ASP.NET MVC應用上工作了好幾個月了。當我第一次開始研究它時,我使用了實體框架4.3(Code-First w/Migrations)。當我這樣做時,我遇到了一些問題,試圖在我的MainClient表上進行更新。 MainClient包含客戶的所有基本信息,並與BPClient表有1:1的關係,其中包含有關該客戶關於BP模塊許可協議的更多具體信息。這兩個選項都可以在選項卡控件的同一頁面上進行編輯。不過,我一直讓試圖改變MainClient對象的EntityState到被EntityState.Modified當出現以下異常:實體框架4.3與5.0更新差異

System.InvalidOperationException : An object with the same key already exists 
in the ObjectStateManager. The ObjectStateManager cannot track multiple objects 
with the same key. 

我注意到在調試對象本身被認爲是獨立式,當它走進我的控制器類被保存。作爲解決此問題的一種解決方法,我對this blog postthis SO question中發現的問題應用了類似的解決方案。下面是其重新連接的對象的代碼後來是怎麼看(亂了,我知道了),給定名爲client一個MainClient對象傳遞給它的編輯方法:

var newClientObject = new MainClient { ClientID = client.ClientID }; 
Db.MainClients.Attach(newClientObject); 
Db.Entry(newClientObject).CurrentValues.SetValues(client); 

var bpClient = new BPClient { ClientID = client.ClientID, BaseClient = newClientObject }; 
if (client.BPClient != null) 
{ 
    Db.BostonpostClients.Attach(bpClient); 
    Db.Entry(bpClient).CurrentValues.SetValues(client.BPClient); 
} 

Db.SaveChanges() 

這通過所有的測試用例工作得非常愉快。直到最近。

最近,我升級了我的應用程序以使用實體框架5(仍然使用Code-First)。當我再次測試MainClient編輯頁面時,我發現了一些相當不穩定的行爲。有些字段在編輯時可以毫無問題地保存。其他人永遠不會對數據庫承諾。還有一些人會堅持得很好,但只有當他們是編輯對象的唯一部分。我調試了Controller類中的DbContext,發現,而且令人惱火的是,不僅在頁面上發送的更改發送到Controller類,而且ObjectStateManager同時具有MainClient和BPClient對象它以及頁面上所做的更改!順便說一句,在這裏我應該提到,在調試時我沒有收到一個錯誤,甚至沒有在SaveChanges()之後。

我決定嘗試恢復的代碼是什麼原本已由,也就是說這樣做的邏輯方式:

Db.Entry<BPClient>(client.BPClient).State = EntityState.Modified; 
Db.Entry<MainClient>(client).State = EntityState.Modified; 

Db.SaveChanges(); 

而現在工作完全正常。無InvalidOperationException。所以這已經解決了。

還有什麼讓我困擾的是試圖找出5.0中的變化,這使得我的早期修復工作停止工作,並在我身上無所適從。爲什麼該代碼在4.3中正常工作,但不在5.0中?在5.0中,那些代碼如此不穩定地向數據庫提交?

有人知道爲什麼會發生這種情況嗎?

+0

它可能會幫助你。 Entity Framework 5從EF 4.3中枚舉和移動解決方案http://thedatafarm.com/blog/data-access/video-entity-framework-5-enums-and-moving-solution-from-ef-4-3/ – Aru

回答

0

我自己也有這個問題。我使用IDbSet類來填充數據庫表,我發現當我做一個屬性虛擬EF5執行延遲加載(我的虛擬屬性在數據庫中的其他對象)。這意味着我爲虛擬財產收到一個新的主鍵。那麼如果我沒有一個與該對象相關的特定ID,我想引用EF 5試圖建立一種雙向關係。如果您沒有在DBContext中明確告知EF要映射到哪個屬性它將兩個外鍵設置爲不允許的同一對象。希望這可以幫助。

+0

謝謝試圖回答我的問題。不過,我認爲這不是這種情況。我已經建立了MainClient和BPClient之間的1:1作爲雙向關係(既有虛擬屬性也有ID)。我只是想弄明白爲什麼代碼突然停止工作。 – IronMan84

+0

只使用virutal屬性導致延遲加載,你有沒有在你的dbcontext屬性之間完成相同的地圖? – Robert

+0

我正在使用數據註釋,而不是FLuent API。映射完全在對象本身上,而不在DbContext中。在4.3和5.0之間發生了什麼事情會影響代碼的延遲加載? – IronMan84