拡張機能に関して質問があります.AsNoTracking()
。これはまったく新しいものであり、非常に混乱を招きます。
ウェブサイトに対してリクエストごとのコンテキストを使用しています。
私のエンティティの多くは変更されないので追跡する必要はありませんが、データベースに何が保存されるのか、あるいはこの場合はそれが何か違いを生むのかどうかさえわからない次のようなシナリオがあります。
これは私が現在行っている例です:
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 回アクセスすると思われます。
違いは何なのか誰か教えてもらえますか?
ベストアンサー1
違いは、最初のケースでは、取得されたユーザーはコンテキストによって追跡されないため、ユーザーをデータベースに保存するときに、ユーザーをアタッチしてユーザーの状態を正しく設定し、EF が新しいユーザーを挿入するのではなく既存のユーザーを更新する必要があることを認識できるようにする必要があることです。2 番目のケースでは、同じコンテキスト インスタンスを使用してユーザーを読み込んで保存する場合は、追跡メカニズムによって自動的に処理されるため、これを行う必要はありません。