ADO.Net Data Servicesで.SaveChanges()メソッドを使用する最良の方法は何ですか?
-
06-07-2019 - |
質問
.SaveChanges()メソッドの使用法に関する良い情報はありますか?
データコンテキストオブジェクトで.SaveChanges()メソッドを使用しようとすると、さまざまな問題が発生します。既存のデータソースからデータを取得し、適切なEntityFramework / DataServiceオブジェクトを作成し、作成したオブジェクトにデータを入力し、それらのオブジェクトをコンテキストに追加し、.SaveChangesを呼び出してそのデータを保存します。
私が思いついたシナリオ(およびそれらに関連する問題)はそうです...各シナリオには、DataTableの行からデータを取得してオブジェクトを生成し、それらを添付するforeachループがあります彼らが行くようにコンテキスト。 (注:SetLink呼び出しを介して接続された3つのオブジェクト「メンバー」と2つの「アドレス」)-基本的に、これは1つのデータストアからデータを取得し、データによって公開されるデータストアにマッサージする変換ツールですサービス。
- foreachループの最後(つまりループ外)でパラメーターなしで.SaveChanges()を1回呼び出します
- OutOfMemoryエラーは約3分の1(90,000回の保存のうち30,000回)-各保存項目はデータベースへの個別のSQL呼び出しであるため、どのようになっているのかわかりません。
- ループなしでパラメータなしで.SaveChanges()を呼び出します
- これは機能しますが、絶対に永遠にかかります(90,000の保存で8時間)
- .eachChanges(SaveChangesOption.Batch)をforeachループの最後に1回呼び出します
- 同じOutOfMemoryエラー、ただしデータベースへの保存なし
- ループごとに1回.SaveChanges(SaveChangesOption.Batch)を呼び出します
- 404エラーが見つかりません
- .SaveChanges(SaveChangesOption.Batch)を10ループごとに1回呼び出す
- 400 Bad Requestエラー(ときどき)
- 多数のイタレーションの後のOutOfMemory
- ループごとに1回コンテキストを作成するか、ループの開始時に変数としてコンテキストを使用するか、使用可能なプライベートメンバー変数としてコンテキストを使用するランダムな試行。
- 定量化できない結果は異なりますが、実際にはそれほど優れていません
このような大量のデータのロードを行うときに、クライアントオブジェクトから.SaveChanges()を呼び出す優先メソッドは何ですか? .SaveChanges()がどのように機能するかについて私が理解していないものはありますか?誰がこの機能をどのように利用する必要があるか、およびData Servicesを介してデータを保存する場合の制限(ある場合)について詳細を提供できますか? .SaveChanges()メソッド呼び出しに関するベストプラクティスはありますか? .SaveChanges()メソッド呼び出しに関する特に優れたドキュメントはありますか?
解決
EntityFrameworkの使用に大きな経験はありません(ランダムな実験のみ)。n回の繰り返しごとに.SaveChanges()を呼び出してみましたか?
次のようなものです:
int i = 0;
foreach (var item in collection)
{
// do something with your data
if ((i++ % 10) == 0)
context.SaveChanges();
}
context.SaveChanges();
itいことはわかっていますが、最初に考え出した解決策です。
他のヒント
小さなプロジェクトでもEntityFrameworkを使用しているため、この質問にも非常に興味があります。 2つの簡単な質問: datacontextのデータオブジェクトのキャッシュを無効にしようとしましたか? ループ中にデータコンテキストを閉じて、新しいコンテキストを作成してメモリを解放しようとしましたか?
よろしく
ケネス