2010-12-08 8 views
8

私はそれ自身がコレクションオブジェクトである子プロパティを持つ親オブジェクトを持っています。すなわち、 Parent.ChildsこれらのEFオブジェクトをWCFで公開しています。別の言い方をすれば、親はInvoice(親)とLineItems(子)の場合のように複数の子を持つことができます。Entity Framework - オブジェクトのリスト全体を取得せずに子オブジェクトへの参照を追加しますか?

クライアント側どのように私は、子オブジェクトを参照し、サービスを通過し、子のリスト全体を取得し、一致する各子オブジェクトに対して手動でParent.Childs.Add(子)を設定せずにChildsコレクションに追加します。

私はParent.Childs = new Childs(){new Child {childId = 1}、new Child {childId = 2}}のようなことをしたいと思います。 Parentをサーバーに送信すると、サーバーはid = 1およびid = 2の子がすでに存在し、それをフックすることを知ります。私は離れていると確信しています。

私はEntityKeyプロパティについて読んでいましたが、オブジェクトクライアント側にはこのプロパティがまったくありません。それはデータベースからそれをロードするまで、エンティティが存在する場合

おかげ

答えて

5
using(var context = new MyEntities()) 
{ 
    var child1 = new Child{ childId = 1 }; 
    context.Children.Attach(child1); 
    var parent = new Parent(); 
    parent.Children.Add(child1); 
    context.SaveChanges(); 
} 
+0

私はエンティティオブジェクトを持つwcfサービスを使用していますので、クライアントサイドに 'コンテキスト'というようなものはありません – David

+0

私はこの解決策を試して、 "同じキーを持つオブジェクトが既にObjectStateManagerに存在しています。 ObjectStateManagerは同じキーを持つ複数のオブジェクトを追跡できません "私はこれをどのように解決すべきか分からない...どんな考え? –

+1

@SimonDugré、重複キーエラーです。同じキーで新しいオブジェクトを追加しようとするのではなく、既にロードしたオブジェクトを更新する必要があります。 –

0

サーバーは知りません。したがって、クライアントに子を追加してサーバーに送信する場合は、新しい子、更新された子、削除された子に関する情報も含める必要があります。このような情報を含めない場合は、DBから完全なエンティティグラフをロードしてから、受信したグラフと読み込まれたグラフを比較し、手動で変更を処理する必要があります。

このような場合の自動解決策は自己追跡エンティティ(STE)でもかまいませんが、あなたの例は機能しません。 STEでは、オブジェクトをロードしてクライアントに送信し、オブジェクトを修正して送り返す必要があります。 STEはすべての変更を追跡します。

+0

私はSTEを使用していますが、現在、サーバーからすべての子を取得し、クライアント側にparent.children.add(子)(サーバーから受信した子)を追加する必要があります。 私はちょうどparent.children.add(新しい子(childid = 1))がdbに保存するときと同じように動作したいと思っていました。これはSTEでこれを行う唯一の方法ですidが1の子が既に存在し、新しい子を作成していないことがわかります。 – David