我在上一篇EF更新指定的字段當中介紹了,如何在EF指定字段進行更新。但這個有個缺陷,如果在同一個上下文當中,進行更新的話就會報:
ObjectStateManager 中已存在具有同一鍵的對象。ObjectStateManager 無法跟蹤具有相同鍵的多個對象
問題的原因在於,我們之前已經附加過當前實體,如果再進行Attach的時候,就會報這樣的錯。
解決辦法:1.銷毀之前的上下文,重新開啟上下文。(等於白說)
2.更改當前上下文的實體的狀態。(這個是問題關鍵)
如下代碼:
//再修改Blog名稱,根據主鍵找到當前實體,判斷然后進行更新狀態 var entry = dbcontext.Set<Blogs>().Find(id); if (entry != null) { dbcontext.Entry<Blogs>(entry).State = System.Data.EntityState.Detached; //這個是在同一個上下文能修改的關鍵 }
這樣就可以了。問題解決。這個是我測試代碼。大家可以根據自己的需求進行封裝。
附帶5個狀態解釋:
成員名稱 | 說明 |
---|---|
Detached | 對象存在,但沒有被跟蹤。 在創建實體之后、但將其添加到對象上下文之前,該實體處於此狀態。 An entity is also in this state after it has been removed from the context by calling the Detach method or if it is loaded by using a NoTrackingMergeOption. 沒有 ObjectStateEntry 實例與狀態為 Detached 的對象關聯。 |
Unchanged | 自對象附加到上下文中后,或自上次調用 SaveChanges 方法后,此對象尚未經過修改。 |
Added | 對象為新對象,並且已添加到對象上下文,但尚未調用 SaveChanges 方法。 在保存更改后,對象狀態將更改為 Unchanged。 狀態為 Added 的對象在 ObjectStateEntry 中沒有原始值。 |
Deleted | 對象已從對象上下文中刪除。 在保存更改后,對象狀態將更改為 Detached。 |
Modified | 對象上的一個標量屬性已更改,但尚未調用 SaveChanges 方法。 在不帶更改跟蹤代理的 POCO 實體中,調用 DetectChanges 方法時,已修改屬性的狀態將更改為 Modified。 在保存更改后,對象狀態將更改為 Unchanged。 |
示例代碼下載:UpdateMoreField.zip