ホームページ > バックエンド開発 > C++ > ASP.NET MVCでエンティティを編集するときにエンティティの重要な競合を解決する方法は?

ASP.NET MVCでエンティティを編集するときにエンティティの重要な競合を解決する方法は?

Linda Hamilton
リリース: 2025-01-30 08:01:09
オリジナル
474 人が閲覧しました

How to Resolve Entity Key Conflicts When Editing Entities in ASP.NET MVC?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート