解決ASP.NET MVC中因主鍵衝突導致的“附加實體”錯誤
在ASP.NET MVC中,編輯模型並將其狀態更新為“已修改”時,可能會遇到錯誤:“附加類型為'MODELNAME'的實體失敗,因為另一個相同類型的實體已具有相同的主鍵值”。此錯誤發生在要更新的實體已存在於上下文的跟踪註冊表中時。
在給定的場景中,錯誤在以下行中拋出:
<code class="language-csharp">db.Entry(aViewModel.a).State = EntityState.Modified;</code>
錯誤分析:
問題源於控制器的Edit (GET)操作,該操作加載要編輯的實體。在此操作中,canUserAccessA方法嘗試通過獨立加載實體來驗證用戶訪問權限。此後續加載將實體置於分離狀態。
解決方案:
為了解決衝突,必須修改canUserAccessA方法,以確保在查詢上下文時不跟踪實體。這可以通過調用.AsNoTracking()
方法來實現,如下所示:
<code class="language-csharp">private bool canUserAccessA(int aID) { int userID = WebSecurity.GetUserId(User.Identity.Name); int aFound = db.Model.AsNoTracking().Where(x => x.aID == aID && x.UserID==userID).Count(); return (aFound > 0); //如果 aFound > 0,则返回 true,否则返回 false。 }</code>
說明:
通過使用.AsNoTracking()
,實體在加載時不會被上下文跟踪。這可以防止後續更新與分離實體的狀態衝突。
結論:
錯誤“附加類型為'MODELNAME'的實體失敗...”可能發生在要更新的實體已被上下文跟踪時。為了解決此衝突,必須確保任何獨立加載實體的操作都禁用跟踪,如修改後的canUserAccessA方法所示。
以上是ASP.NET MVC:如何由於重複的主密鑰而解決'附加實體失敗”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!