2011-08-24 14 views
8

エンティティフレームワークと複数のスレッドに問題があります。遅延読み込み機能を維持するソリューションがあるかどうかは疑問です。私の理解から、データコンテキストはスレッドセーフではないため、同じデータコンテキストを使用する複数のスレッドがあると、さまざまなデータリーダーエラーが発生します。この問題の解決策は、データベースへの接続ごとに個別のデータ・コンテキストを使用し、データ・コンテキストを破棄することです。残念なことに私のデータコンテキストを破壊すると、遅延読み込みができなくなります。エンティティフレームワーク+複数スレッド+遅延ロード

アプリケーション間で共有されたコンテキストを持つことができますが、複数のスレッドを適切に処理できるパターンはありますか?

+0

EF遅延ロードと組み合わせてParallel.ForEachを使用すると、同様の問題が発生しました。 – tjrobinson

答えて

9

いいえ、そのような解決策はありません。マルチスレッドのアプリケーション内の選択肢は次のとおりです。スレッドごと

  • コンテキスト
  • そのコンテキストへのアクセスごとに同期してunproxiedデタッチのエンティティを生成シングルコンテキスト(無遅延ロード、変更なしの追跡)。

プロキシされた添付エンティティで2番目のアプローチを実行することは、災害につながります。コンテキストとのすべての隠された対話を検出し、関連するコードを同期させる必要があります。おそらく、複数の切り替えスレッドで実行されているシングルスレッドプロセスで終了します。

+0

+1これは技術的に正しいためですが、アプリケーション全体で1つのコンテキストを共有することは、1つのスレッドでも問題になります。文脈は仕事の単位であり、短命でなければならない。 –

+0

@Craig:それは正しいです。私は、アプリケーション全体で1つのコンテキストインスタンスを意味するのではなく、複数のスレッドが1つの「論理演算」で動作するコンテキストを意味しました。エンティティを切り離さなければならない場合、まだ作業単位であるかどうかはわかりません。 –

+0

ありがとうございます。それが私の答えが分かるものです。 –