ループ内で EF エンティティに変更が加えられたと仮定して、foreach ループ内またはループ外で EF SaveChanges() を呼び出す間に、パフォーマンス上の利点や技術的な違いはありますか?
4 に答える
はい!
ループ内で呼び出すと、EF はすべてのエンティティの変更をデータベースに書き戻します(すべてのエンティティは独自の個別のトランザクションになります)。
逆に、すべての変更を行うと、EF はループの後でそれらをすべて一度に書き戻します (すべてのエンティティをまとめて 1 つのトランザクションで)。
一般的な経験則として (実際にコードを確認することなく)、 への呼び出しをできるだけ少なくするようにし.SaveChanges()
てください。
通常、50 回の変更を伴う 1 回の呼び出しは、それぞれ 1 回の変更に対して 50 回の呼び出しを行うよりもはるかに優れており、高速であり、効率的です。
ループの外側では、データベースを更新するトランザクションが 1 つだけ作成され、もう 1 つのトランザクションは反復ごとに 1 つのトランザクションが作成されます。EF は、すべての変更をメモリ内に保持する Unit Of Work パターンを使用し、SaveChanges メソッドで DB に加えたすべての変更を保存するためです。
パフォーマンスは異なります。ループ内では、反復ごとにデータベースを呼び出します。ループの外側で、データベースを 1 回呼び出します。これにより、反復回数に応じてパフォーマンスが大きく異なります。