2

私はプロデューサー/コンシューマーパターンを実装しています:

プロデューサー

  • 検索条件に基づいてDBからオブジェクトを具体化します
  • 追加のアプリケーション固有のフィルタリングロジックを適用します
  • さらに処理するためにマテリアライズドオブジェクトをキューに入れます

コンシューマー(複数のスレッド)

  • キューからマテリアライズされたオブジェクトを受け取ります
  • マテリアライズされたオブジェクトからのデータを使用して電子メールテンプレートにデータを入力します
  • マテリアライズされたオブジェクトの状態を更新します
  • 新しいオブジェクトの状態をDBに保存します

問題

オブジェクトは、Entity Framework Code Firstを使用して、プロデューサースレッドに関連付けられたコンテキストを使用して実体化されます。

コンシューマースレッドには独自のコンテキストが必要です。

マテリアライズされたオブジェクト(各オブジェクトは実際にはオブジェクトグラフです)をプロデューサーコンテキストからコンシューマーコンテキストに移動することは可能ですか、またはオブジェクトを更新するためにコンシューマーのコンテキストでオブジェクトを再マテリアライズする必要がありますか?どうすれば移動できますか?

4

1 に答える 1

2

私はあなたが欲しいものは次のとおりだと思います:

  • キューからマテリアライズされたオブジェクトを受け取ります
  • マテリアライズされたオブジェクトからのデータを使用して電子メールテンプレートにデータを入力します
  • マテリアライズされたルートを新しいコンテキストにアタッチします(このコンテキストのスコープを小さくしてください)
  • マテリアライズされたオブジェクトの状態を更新します
  • 新しいオブジェクトの状態をDBに保存します

Entity Frameworkを使用すると、オブジェクトをコンテキスト追跡グラフに再アタッチして、データベース内のオブジェクトの現在の状態として扱うことができます。これは、更新ブロックでタッチしたプロパティのみが更新されることを意味します。

つまり、更新のパスを事前に選択せずに、この更新を追跡する必要があります。

using (var context = new MyContext())
{
    var dummy = new Test{Id= 1};
    context.Tests.Attach(dummy);
    dummy.Something = "Hello World";
    context.SaveChanges();
}

この方法について注意することが重要なのは、エンティティ(一意のキーによって定義される)を追跡グラフにアタッチできるのは1回だけであるということです。したがって、これを分離されたコンテキストで実行するか、接続呼び出しを注意深く管理することが非常に重要です。

于 2012-07-21T05:31:39.107 に答える