EF Core の .AsNoTracking()
とデータベースの書き込み: 明確化
Entity Framework Core (EF Core) は、変更追跡を無効にしてクエリを最適化する .AsNoTracking()
を提供します。 これは、データを読み取る必要があるだけで、現在のコンテキスト内でデータを変更するつもりがない場合に役立ちます。 ただし、その後のアップデートへの影響については慎重に検討する必要があります。
あなたの例では、共通の混乱点が強調されています:
シナリオ: リクエストごとのコンテキストを使用して、最初に .AsNoTracking()
でユーザーを取得し、次に同じユーザーの更新を試みます。
ステップ 1: context.Set<user>().AsNoTracking()
は、 追跡なしでユーザーを取得します。
ステップ 2: context.Set<user>()
は追跡されていないユーザーの更新を試みます。
重要な違い:
.AsNoTracking()
を使用する場合と使用しない場合の主な違いは、EF Core がエンティティの状態を管理する方法にあります。
.AsNoTracking()
なし: EF Core はエンティティを追跡します。 更新して保存すると、EF Core は変更を自動的に検出し、それに応じてデータベースを更新します。 エンティティを変更する場合、これはよりシンプルで直接的なアプローチです。
.AsNoTracking()
の場合: エンティティは追跡されません。 EF Core は、ユーザーが行った変更については知りません。 データベースを更新するには、context.Entry(user).State = EntityState.Modified;
を呼び出す前に、context.SaveChanges()
を使用してエンティティをコンテキストに明示的にアタッチする必要があります。 そうしないと、既存のレコードが更新されるのではなく、新しいレコードが挿入される可能性があります。
つまり、.AsNoTracking()
は読み取り専用操作のパフォーマンスを向上させます。 更新操作の場合は、最初の取得で .AsNoTracking()
を使用しないようにするか、変更を保存する前にコンテキスト内でエンティティの状態を手動で管理できるように準備してください。 選択は、特定のニーズと、パフォーマンスを優先するか、より単純なコードを優先するかによって異なります。
以上がEF Core の「.AsNoTracking()」はエンティティ更新時のデータベース書き込みに影響しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。