首頁 >後端開發 >C++ >如何解決ASP.NET MVC中的'由於重複的主要鑰匙值的重複主鍵值失敗”的'附加實體失敗”?

如何解決ASP.NET MVC中的'由於重複的主要鑰匙值的重複主鍵值失敗”的'附加實體失敗”?

Patricia Arquette
Patricia Arquette原創
2025-01-30 08:16:101029瀏覽

How to Resolve

在將實體附加在ASP.NET MVC

中時,將重複的主鍵錯誤進行故障排除。 在ASP.NET MVC應用程序中,由於重複的主要密鑰約束違規,嘗試附加實體可能會失敗。 這通常表現為一個錯誤消息,表明具有相同主鍵的實體已經存在。 本文詳細介紹了一個共同的原因及其解決方案。 使用

將實體的狀態更新為

時,問題經常出現。 調查通常表明,在狀態更新之前,一個單獨的功能負責授權或數據檢索的單獨函數,請預先加載相同的實體

>。 此預加載過程可能會導致實體變得分離,從而導致後續操作失敗,因為該框架認為它正在嘗試添加重複。

>解決方案涉及防止預加載函數跟踪加載實體。 這可以通過在實體框架查詢中利用EntityState.Modified的方法來實現。 db.Entry(entity).State = EntityState.Modified> 考慮有問題的函數的以下示例:Attach>

>此功能加載實體,使其可通過上下文跟踪。 要糾正這一點,請修改函數以使用AsNoTracking()

>

canUserAccessA使用

>確保上下文不跟踪已加載的實體,從而防止與後續
<code class="language-csharp">// Problematic function - loads and tracks the entity
private bool canUserAccessA(int aID)
{
    int userID = WebSecurity.GetUserId(User.Identity.Name);
    int aFound = db.Model.Where(x => x.aID == aID && x.UserID == userID).Count(); // Tracks the entity

    return (aFound > 0);
}</code>
>或

操作發生衝突。 請注意,在與AsNoTracking()一起使用

的同時似乎更簡單,但根據數據庫和上下文配置,它可能無效。 提供的查詢提供了一種更強大的方法。
<code class="language-csharp">// Corrected function - loads the entity without tracking
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);
}</code>

此修改有效地解決了重複的主要關鍵問題,為ASP.NET MVC開發中的類似問題提供了可靠的解決方案。

以上是如何解決ASP.NET MVC中的'由於重複的主要鑰匙值的重複主鍵值失敗”的'附加實體失敗”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn