2011-10-26 14 views
1

私はWCF Dataservice/EF 4.1とWPFクライアントアプリケーションを使用しています。 ここで私の問題は簡単な形式です。私はクライアントに問い合わせると言う:既に追跡されたエンティティで追加データを '展開'できますか?

var query = (from o in ServiceRef.Clients.Expand("Addresses,PhoneNumbers,EmailAddresses") 
         where o.FirstName.ToLower().Contains(sf) || 
          o.LastName.ToLower().Contains(sf) || ... 
         orderby o.LastName 
         select o).Take(100); 

これは私がクライアントを識別するために必要なすべてです。しかし、私は最初のクエリで "展開"されていないコメント、購入履歴、またはその他の関連するエンティティを見たいと思っている。同じServiceRefコンテキストを使用して再度クエリを実行すると、「コメント」が展開されることはありません。

「クライアント」エンティティが既に追跡されているため、サービスに対して新しいクエリを実行していないことがコンテキストと関係していると推測しています。

ここでいくつかの投稿によると、私は完全に同意しないDBContextをその周りに置いてはいけません。シンプルなマスター/詳細シナリオです。追加のデータを取得するために、「詳細クエリ」ごとに新しいコンテキストを作成することは、何らかの形で間違っているようです。追加のデータを取得するためにEFにエンティティを「リロード」させる方法はありますか?

初期クエリで必要なすべての添付エンティティを展開できます。しかし、私は検索結果ごとに大量のデータを圧縮します。その95%が決して使用されることはありません。

明確になります。私が求めているのは、「ベストプラクティス」の問題です。途中に道がありますか?すべてのデータを常に展開する(...)の間<>常に新しいコンテキストを作成する。必要に応じて追加データを読み込む方法はありますか?

Thanx、Andreas

答えて

1

あなたの質問には2つの部分があります。

追加データの入手方法は?

  • あなたはどちらかあなたの最初のクエリでServiceRef.Clients.Expand("Comments")を使用することができますが、それは明らかにあなたがしたくない何かである - これは積極的なロード
  • 呼び出されるか、あなただけの単一のクライアントのコメントを取り込むためにServiceRef.LoadProperty(client, "Comments")を使用することができます - これは、することができ明示的ローディングと呼ばれるもの

どのくらいの期間コンテキストが生きていますか?

によって異なります。正しいアプローチは、コンテキストを可能な限り短くしておくことですが、各操作後にコンテキストを閉じることを意味するわけではありません。コンテキストは作業単位として使用する必要があり、すべての関連する操作は同じコンテキストインスタンスで操作する必要があります。 WPF/WinFormアプリケーションの場合は、コンテキストが実際にはより長い時間存続できることを意味します。通常、フォーム/プレゼンター/などとペアになります。関連していない複数のフォーム間で同じコンテキストを使用しないでください。単一の作業単位/論理操作(同じ作業単位内のオブジェクトは一緒に操作され、保存されます)を形成します。

+0

LoadProperty()で私を指摘してくれたLadislavに感謝します。私は今までそれが何だったのか分からなかった。コンテクスト・ライブ・スパンの部分では、作業単位の「範囲」のサイジングをかなり頻繁に行っています。ほとんどの場合、save()を実装しています。 Thanx – Andreas

+0

EFを追跡するすべてのことで、このような動作を組み込むのはうれしくない/可能ではないだろうか...既に追跡されているが、すべてのプロパティではない - >不足しているプロパティを読み込む – Andreas

関連する問題