.AsNoTracking(): 更新の詳細な説明と影響
EF Core の .AsNoTracking()
メソッドは、特に初心者にとってはわかりにくいことがよくあります。その役割を説明するために、特定のシナリオとそれがデータベース相互作用に及ぼす影響を分析してみましょう。
Web サイトのエンティティがリクエストごとのコンテキストに保存されていると仮定します。多くのエンティティは変更されないため、追跡する必要はありません。ただし、次のシナリオでは難しい問題が生じます:
<code class="language-csharp">context.Set<User>().AsNoTracking() // 步骤 1) 获取用户 context.Set<User>() // 步骤 2) 更新用户</code>
または、ステップ 1 から .AsNoTracking()
を削除することもできます:
<code class="language-csharp">context.Set<User>(); // 步骤 1) 获取用户 context.Set<User>() // 步骤 2) 更新用户</code>
どちらの場合も、コンテキストは取得 (ステップ 1) と更新 (ステップ 2) に使用されますが、それらは異なるタイミングで行われます。問題は、それが違いを生むかどうかということです。
答えは追跡の性質にあります。最初のシナリオでは、ステップ 1 で .AsNoTracking()
が使用され、取得されたユーザーはコンテキストによって追跡されません。これは、ユーザーを更新するとき (ステップ 2)、ユーザーを手動でアタッチし、そのステータスを明示的に「変更済み」に設定する必要があることを意味します。これにより、新しいレコードを作成するのではなく、既存のユーザーを更新するように EF Core に指示されます。
対照的に、.AsNoTracking()
を使用しない 2 番目のケースでは、同じコンテキスト インスタンスでユーザーをロードして保存する場合、これらの手動手順を実行する必要はありません。追跡メカニズムはこれを自動的に処理し、追加の構成を行わずに更新されたユーザーにサービスを提供します。
これら 2 つのメソッドの違いをまとめると、.AsNoTracking()
では取得されたエンティティの追跡が無効になり、更新中にオブジェクトの状態と添付ファイルを手動で管理する必要があるということです。 .AsNoTracking()
を使用せずに取得と更新に同じコンテキストを使用すると、追跡メカニズムがこれらの側面を透過的に処理するため、このプロセスが簡素化されます。
以上がEF Core AsNoTracking(): 更新が重要になるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。