エンティティフレームワークで追跡されたエンティティをクリアするにはどうすればよいですか?質問する

エンティティフレームワークで追跡されたエンティティをクリアするにはどうすればよいですか?質問する

大量のエンティティを処理する修正コードを実行していますが、処理が進むにつれて速度が低下します。これは、コンテキスト内の追跡対象エンティティの数が反復ごとに増加するためです。時間がかかる可能性があるため、各反復の最後に変更を保存します。各反復は独立しており、以前に読み込まれたエンティティは変更されません。

変更の追跡をオフにできることはわかっていますが、これは一括挿入コードではなく、エンティティをロードしていくつかの計算を行い、数値が正しくない場合は新しい数値を設定し、いくつかの追加エンティティを更新/削除/作成するため、オフにしたくありません。反復ごとに新しい DbContext を作成できることはわかっています。おそらく、同じインスタンスですべてを実行するよりも高速に実行されますが、もっと良い方法があるのではないかと考えています。

質問は、以前に DB コンテキストにロードされたエンティティをクリアする方法があるかどうかです。

ベストアンサー1

今では、電話をかけるだけでcontext.ChangeTracker.Clear();EF Core 5.0以降を使用している場合


DbContextそれ以外の場合は、 ChangeTracker を使用してすべての Added、Modified、Deleted、および Changed エンティティをデタッチするメソッドまたは拡張メソッドを、次のように追加できます。

public void DetachAllEntities()
{
    var undetachedEntriesCopy = this.ChangeTracker.Entries()
        .Where(e => e.State != EntityState.Detached)
        .ToList();

    foreach (var entry in undetachedEntriesCopy)
        entry.State = EntityState.Detached;
}

おすすめ記事