281

.AsNoTracking()これはすべて非常に新しく、非常に紛らわしいため、拡張機能について質問があります。

Web サイトにリクエストごとのコンテキストを使用しています。

多くのエンティティは変更されないため、追跡する必要はありませんが、次のシナリオでは、データベースに何が行われるか、またはこの場合に違いが生じるかどうかさえもわかりません.

この例は、私が現在行っていることです:

context.Set<User>().AsNoTracking()
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

これは上記と同じですが、.AsNoTracking()ステップ 1 から を削除します。

context.Set<User>();
// Step 1) Get user
context.Set<User>()
// Step 2) Update user

ステップ 1 と 2 は同じコンテキストを使用しますが、異なるタイミングで発生します。私が解決できないのは、違いがあるかどうかです。ステップ 2 は更新であるため、どちらもデータベースに 2 回ヒットすると思います。

違いは何ですか?

4

6 に答える 6

228

違いは、最初のケースでは、取得されたユーザーがコンテキストによって追跡されないため、ユーザーをデータベースに保存するときに、EFが既存のユーザーを更新する必要があることを認識できるように、ユーザーをアタッチしてユーザーの状態を正しく設定する必要があることです。新しいものを挿入する代わりに。2番目のケースでは、同じコンテキストインスタンスでユーザーをロードして保存する場合、追跡メカニズムがそれを処理するため、これを行う必要はありません。

于 2012-08-31T08:39:20.647 に答える
40

追跡を無効にすると、結果セットもメモリにストリーミングされます。これは、大規模なデータ セットを操作していて、データ セット全体を一度に必要としない場合に、より効率的です。

参考文献:

于 2013-12-07T02:03:01.257 に答える