2011-01-07 9 views
1

愚かな質問を申し訳ありませんが、これはWPFとEntity Frameworkで初めてのアプローチです。EntityFrameworkでWPF ObservableCollectionのマスターディテールアイテムを更新する

は、私は両方の私のEFコンテキストで、マスタークラス(お客様)とディテールクラス(受注)を持っている

...さんは私のシナリオを説明しましょう。 マスタクラスをLINQ-to-EFクエリ(Ordersを含む)でロードし、ListBoxのソースとして使用されるObservableCollectionにIEnumerable結果セットを格納します。

次に、私は注文を読み込むDataGridを持っています。 マスターアイテムはObservableCollection内にあるので、アイテムを追加、削除、更新することができ、ListBoxに自動的に反映されます。 問題は、顧客に注文を追加する必要がある場合です。

コンテキストからすべてのアイテムを再ロードせずにObservableCollection内のアイテムのみを更新する方法はありますか?

これが問題の一部は手動で注文に関連(外部キー)プロパティを設定することができる私のコード(簡体字)事前に

// Loading Customers 
EntitiesContext context = new EntitiesContext(); 
IEnumerable<Customer> customers = from c in context.Customer.Include("Orders") 
              select c; 
ObservableCollection<Customer> oc = new ObservableCollection<Customer>(customers); 
// Binding ListBox 
listCustomers.ItemsSource = oc; 

... 

// Retrieving a Customer (1st for instance...) 
Customer c = (listCustomers.Items[0] as Customer); 
Order o = new Order {Customer = c.ID, Item = "xxx"}; 
context.AddToOrders(o); 

// How can I update the ObservableCollection? 

おかげで、

マヌエル

答えて

0

です。 、あなたがオブジェクトを作成するには、このようにして

Order o = new Order {Item="xxx"}; 
c.Orders.Add(o); 
context.AddToOrders(o); 

の背後にある(あなたがそれをしたいローカル側のコレクションに追加:EFで親オブジェクトにオブジェクトを追加するときは、本当にただ以下のような何かをシーンEFはその作成を追跡し、キーとアソシエーションキーを与えることを覚えています)、これをコンテキスト全体のオーダーコレクションに追加します。

この操作が完了したら、必ず変更を保存してください。保存された変更は、FK値を作成してデータベースに保存します。

さらに、複雑なオブジェクト階層が2つのクラスだけであれば、あなたのコードに本当にぎこちないインクルードステートメントを入れたくない場合は、LazyLoadingを調べるかもしれません。これは、実際に要求されたときにのみ必要なデータを取得し、LINQステートメントをより簡潔に保ちます。

+0

あなたの答えをありがとう!そうしたやり方で私は顧客に注文を追加するだけですが、私はObservableCollectionを更新しません。 – Flea777

+0

問題ありません。これが回答として機能する場合は、投票してください。答えとしてマークしてください。 – CodeWarrior

+0

Listと対話する代わりに、ObservableCollectionと対話することが最善です。次のようなことを試してください:oc [0] .Orders.Add(o);.リストがバインドされていると思いますが、TwoWayバインディングとして指定されていないため、リストには値/オブジェクトが設定されていますが、リストへの変更は元に戻されません。ソースと独占して作業することで、それを軽減し、すべての対話を1か所で行うことができます。 – CodeWarrior

関連する問題