首頁 > 後端開發 > C++ > ASP.NET MVC:如何由於重複的主密鑰而解決'附加實體失敗”錯誤?

ASP.NET MVC:如何由於重複的主密鑰而解決'附加實體失敗”錯誤?

Linda Hamilton
發布: 2025-01-30 07:56:09
原創
656 人瀏覽過

ASP.NET MVC: How to Solve

解決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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板