2011-12-07 17 views
3

WCFサービスコール経由で提供されたEntity Frameworkコンテキストにオブジェクトツリーを添付しようとしています。問題のオブジェクトには子アイテムのコレクションがあり、各子アイテムには別の追跡オブジェクトタイプのプロパティがあります。しかし、これらの最後のアイテムは少数しかないので、ほとんどのコレクションアイテムがそれらを共有します。 (EntityObjectsと明らかに、除く、)このような何か:私は、同じ製品のために複数の詳細を持って注文を持っているときはいつでも、複数のコピーを添付しようとしているので、Entity Frameworkのは、取り付け時に文句を言いEntity Framework Attach()共有オブジェクトを持つオブジェクトツリー

public class Product 
{ 
    public int Id; 
    public string Name; 
    public decimal Cost; 
} 

public class Order 
{ 
    public int Id; 
    public List<Detail> details; 
} 

public class Detail 
{ 
    public int Id; 
    public Product Product; 
    public int Quantity; 
} 

同じプロダクトキー。この情報はWCF ServiceOperationから入ってくるので、クライアントでは共有オブジェクトのセットであっても、Productの個別のインスタンスとして逆シリアル化されています。

アタッチが発生したときに、追跡されたエンティティを再利用するようにEFオブジェクトコンテキストに指示する方法はありますか?私は製品を直接接続していないので、TryGetObjectStateEntryのチェックのようなトリックは機能しません。

提案がありますか?

EDIT:

私はSlaumaの答えの代替として使用することができ、クライアント側のオプションのカップルが含まれて(私が使用してに切り替えている)自己追跡エンティティに関する次の記事、全体で走っ

、サーバー側で調整コードを保持します。 (自己追跡エンティティは(アタッチを使用する必要性を排除する)が、重複キーの問題がまだ存在しています。)

http://blogs.msdn.com/b/diego/archive/2010/10/06/self-tracking-entities-applychanges-and-duplicate-entities.aspx

答えて

1

いいえ、方法はありません。あなたは基本的にあなたが接続する前に、キーごとにオブジェクト参照が一意のような何かを行う必要があります。

void PrepareForAttach(Order order) 
{ 
    var dict = new Dictionary<int, Product>(); 
    foreach (var detail in order.Details) 
    { 
     Product firstProduct; 
     if (dict.TryGetValue(detail.Product.Id, out firstProduct)) 
      detail.Product = firstProduct; 
     else 
      dict.Add(detail.Product.Id, detail.Product); 
    } 
} 

EFが基準アイデンティティをオブジェクトへの鍵IDをマッピングし、それが中に同じキーを持つ2つの以上のオブジェクトを持ってすることはできません。文脈独自の参照をユニークにする機能もありません。これは、と同じキーを使用して製品のいずれかを何らかの形で選択することを意味します。正しいキーの製品です。 (あなたは同じキーであるが他のプロパティが異なる2つの製品を持つことができますが、そのキーの「正しい」製品ですか?EFはそれを決めることを拒否します。簡単で安全なモード:例外をスローする)

関連する問題