1

一括アップロードジョブにEntityFrameworkを使用することを検討しています。記録された各アイテムの個々の結果を追跡することに関心があるため、挿入されたすべてのアイテムがトランザクションの一部として実行されているかどうか、単一の障害がロールバックを引き起こすかどうか、または結果を追跡する方法があるかどうかを調べようとしています。個々の結果の。

アイテムをループしてそれぞれでSave()を呼び出し、それをtry / catchブロックでラップすることを考えていましたが、個々の結果を利用できる場合は、コンテキストでsave()を呼び出すだけの方が効果的です。

ありがとう!

4

1 に答える 1

3

デフォルトでは、呼び出すたびにSaveChanges、保留中のすべてのレコードが一度に保存されます。呼び出し内のすべての操作SaveChangesはトランザクション(ソース)内にあるため、特定のSaveChanges呼び出しが失敗すると、その特定の呼び出しのクエリがロールバックされますが、以前は成功しなかった呼び出しです。

最終的には、どの程度のロールバックを取得するかについて、SaveChangesをどこで呼び出すかによって異なります。スコープを拡張する方法の例については、この記事TransactionScopeを参照して、トランザクションの長さを拡張できます。

私自身の経験では、SaveChangesを頻繁に呼び出すと、パフォーマンスが大幅に低下し、プロセス全体の速度が大幅に低下する可能性があります。ただし、明らかに長時間待機すると、メモリフットプリントが大きくなる可能性があります。EFは、メモリの問題をあまり発生させずに、数千行を簡単に処理できることがわかりました。

コードをtry...catchに配置すると役立ちますが、オブジェクトに制限を設定すると、SQLが生成される前にオブジェクトに対して検証が行われるため、エンティティの検証を確認することをお勧めします。

于 2012-10-25T13:32:31.297 に答える