エンティティのトラブルシューティングASP.NET MVCエンティティの更新の重要な競合
POSTリクエストを介してASP.NET MVCのエンティティを更新する場合、次のエラーが発生する可能性があります。
このエラーは、エンティティを<code>Attaching an entity of type 'MODELNAME' failed because another entity of the same type already has the same primary key value.</code>
はエンティティをマージしようとし、競合をもたらします。DbContext
DbContext
コントローラー内の「A」エンティティを編集することを想像してください。 Get Actionは
を使用してエンティティをロードします。 その後、ポストアクションは添付および更新を試みます。 ただし、同じプライマリキーを持つ別の「a」エンティティが他の場所にロードされている場合(たとえば、ユーザーアクセス検証中)、これは追跡競合を作成します。Find()
解像度を使用して
AsNoTracking()
最も効果的な解決策は、DBContextが検証に使用されるエンティティの追跡を防ぐことです。 メソッドを使用してください:
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); }</code>
代替:AsNoTracking()
方法
別のアプローチでは、Detach()
メソッドを使用して変更する前に、からエンティティを取り外すことが含まれます。これにより、競合の追跡が防止されます。 ただし、このソリューションを実装する前に、ディタッチがコードの他の部分に影響を与える可能性があることに注意してください。
以上がASP.NET MVCでエンティティを編集するときにエンティティの重要な競合を解決する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。