我已經在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 post和this 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中,那些代碼如此不穩定地向數據庫提交?
有人知道爲什麼會發生這種情況嗎?
它可能會幫助你。 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