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