2015-03-30 161 views
0

我嘗試使用EF 插入時遇到問題。這裏的情況:實體框架:插入時出錯

  1. 我做了一個正常插入時,我創建了其中一個PK收到MAX函數的返回從SQL
  2. 然後,我已經刪除從數據庫中此行沒有EF
  3. 最後一個新的註冊表,我試圖插入一個新的註冊表與EF,像我一樣的步驟1

我再從Visual Studio中得到這個消息:

對數據庫的更改已成功提交,但更新對象上下文時發生錯誤。 ObjectContext可能處於不一致的狀態。內部異常消息:由於對象的鍵值與ObjectStateManager中的另一個對象衝突,因此AcceptChanges無法繼續。在調用AcceptChanges前,請確保鍵值是唯一的

爲了說明我的問題,我製作了this small video

我能做些什麼來解決這個問題?

+0

如果您在第2步和第3步之間停止程序並重新啓動,會發生什麼情況? – 2015-03-30 19:50:38

+0

在這種情況下,工作得很好 – 2015-03-30 20:11:36

+1

實體框架在加載它們時會在內存中保存實體的副本。因此,如果實體已經加載並且您刪除數據庫中的一行,則內存中仍有一個副本。現在當你嘗試插入一個實體時,EF會發現已經有一個存在於內存中的相同鍵的對象(即使它已經在數據庫中被刪除),並且會引發錯誤。 – 2015-03-31 00:27:47

回答

0

嘗試使用AsNoTracking當您最初檢索實體:

using (var context = new MyContext()) 
{ 
    var myEntities = context.MyEntities.AsNoTracking(); 

    // then you can manually delete a row in the database 
    // and insert it again here in code 

    context.SaveChanges(); 
} 

這樣,實體將不會被ObjectContext緩存。請注意,這將影響依賴跟蹤機制的代碼區域(如果有的話)。

+0

感謝您的幫助@OJRaqueño。 我已經嘗試過你的解決方案整天,以幾種方式,但他們都沒有工作。 然後我繼續尋找答案,直到找到[link](https://social.msdn.microsoft.com/Forums/en-US/f57428a8-1430-4e06-be32-70ddc3f27f84/key-clash-when -adding,刪除和-readding實體與 - 相同的密鑰,爲什麼呢?論壇= adodotnetentityframework)。 我開始認爲這個問題除了重構我的所有數據庫之外沒有任何解決方案。但是這個解決方案非常昂貴。 您有任何其他想法可以嘗試嗎? – 2015-03-31 19:45:23