8

.SaveChanges() メソッドの使用法に関する良い情報を持っている人はいますか?

データ コンテキスト オブジェクトで .SaveChanges() メソッドを使用しようとすると、さまざまな問題が発生します。既存のデータ ソースからデータを取得し、適切な EntityFramework/DataService オブジェクトを作成し、作成したオブジェクトにデータを入力し、それらのオブジェクトをコンテキストに追加してから、.SaveChanges を呼び出してそのデータを保存しています。

私が思いついたシナリオ (およびそれらに関連する問題) は次のとおりです...各シナリオでは、DataTable の行からデータを取得してオブジェクトを生成し、それらをコンテキストにアタッチする foreach ループがあります。彼らが行く。(注: SetLink 呼び出しを介してアタッチされた 3 つのオブジェクト「メンバー」と 2 つの「アドレス」) - 基本的に、これは 1 つのデータ ストアからデータを取得し、それを Data Services によって公開されるデータ ストアに変換するための変換ツールです。

  • foreach ループの最後 (つまり、ループの外側) で、パラメータなしで .SaveChanges() を 1 回呼び出します。
    • 約 1/3 の OutOfMemory エラー (90,000 回の保存のうち 30,000 回) - 各保存項目はデータベースへの個別の SQL 呼び出しであるため、どのように発生しているのかわかりませんが、メモリ不足になる原因は何ですか?
  • ループごとに 1 回、パラメータなしで .SaveChanges() を呼び出します
    • これは機能しますが、絶対に永遠にかかります(90,000回の保存で8時間)
  • foreach ループの最後に .SaveChanges(SaveChangesOption.Batch) を 1 回呼び出します。
    • 同じ OutOfMemory エラーですが、データベースへの保存はありません
  • ループごとに .SaveChanges(SaveChangesOption.Batch) を 1 回呼び出す
    • 404 見つからないエラー
  • 10 ループごとに .SaveChanges(SaveChangesOption.Batch) を 1 回呼び出す
    • 400 Bad Request エラー (時折)
    • 何度か繰り返した後の OutOfMemory
  • ループごとに 1 回コンテキストを作成するか、ループの開始時にコンテキストを変数として使用するか、使用可能なプライベート メンバー変数として使用するためのランダムな試行回数。
    • さまざまな結果、定量化できない、それほど良いものはありません

このような大量のデータの読み込みを行うときに、クライアント オブジェクトから .SaveChanges() を呼び出す方法として推奨されるものは何ですか? .SaveChanges() がどのように機能するかについて私が得ていないものはありますか? この機能をどのように利用すべきか、および Data Services を介してデータを保存する際の制限事項 (ある場合) について、詳細を提供できる人はいますか? .SaveChanges() メソッド呼び出しに関するベスト プラクティスはありますか? .SaveChanges() メソッド呼び出しに関する特に優れたドキュメントはありますか?

4

2 に答える 2

4

私は EntityFramework を使用した経験があまりありません (ランダムな実験にすぎません)。

私は次のようなことを意味します:

int i = 0;
foreach (var item in collection)
{
    // do something with your data
    if ((i++ % 10) == 0)
        context.SaveChanges();
}
context.SaveChanges();

私はそれが醜いことを知っていますが、それは私が思いついた最初の可能な解決策です.

于 2008-12-11T15:09:01.740 に答える
0

私も小さなプロジェクトでEntityFrameworkを使用しているので、質問にも非常に興味があります。2 つの簡単な質問: データ コンテキスト内のデータ オブジェクトのキャッシュをオフにしようとしましたか? データコンテキストを閉じようとして、ループ中に新しいものを作成してメモリを解放しましたか?

よろしく

ケネス

于 2008-11-04T14:10:46.263 に答える