Entity Framework 同一個上下文中,如何進行對同一個實體進行指定字段更新


我在上一篇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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM