ホームページ >バックエンド開発 >C++ >「プライマリキー値の重複のためにエンティティの添付が失敗する」ASP.NET MVCのエラーを解決する方法は?

「プライマリキー値の重複のためにエンティティの添付が失敗する」ASP.NET MVCのエラーを解決する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-30 08:16:10990ブラウズ

How to Resolve

トラブルシューティング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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。