2011-12-14 26 views
4

Entity Frameworkを使用すると、コンテキスト内のレコードをクエリし、同じスキーマを持つ別のコンテキストに追加する必要があります。レコードをクエリした後、デタッチしますコンテキストが、関連するエンティティはすべて離れている、それを解決する方法はありますか?Entity Frameworkエンティティと関連するエンティティをデタッチします

ありがとうございます!

+0

「関連するエンティティがすべて離れている」とはどういう意味ですか? – Yuck

答えて

8

これは「設計通り」です。 EFはエンティティを1つずつデタッチすることができますが、EFは同時にアタッチされたエンティティとデタッチされたエンティティで構成されるオブジェクトグラフをサポートしません。そのため、エンティティをデタッチすると、残りのオブジェクトグラフとの関係がすべて破棄されます。オブジェクトグラフ全体の分離は現在サポートされていませんが、Data UserVoiceでこの機能に投票することができます。

回避策として、コンテキストで遅延ロードをオフにすることができます。@CodeWarriorで説明されているeagerローディングを使用して、別のコンテキストに渡す必要のあるデータを正確にロードします。データをロードしたら、それらをストリームにシリアル化し、オブジェクトグラフの新しいインスタンスに直ちにデシリアライズします。これは、デタッチされたエンティティグラフの深いクローンを作成する方法ですが、すべてのリレーションがそのままです(レイジーローディングをオフにする必要があります。そうしないと、シリアル化によって他のナビゲーションプロパティもロードされ、唯一の要件は、あなたのエンティティがあなたの選択したシリアライザによって直列化可能でなければならないことです(エンティティに特別な処理や追加の属性が必要な循環参照に注意してください)。

+0

あなたの返信ありがとう! – James

3

子エンティティの読み込み方法を尋ねていますか?その場合は、.Includeメソッドを使用して積極的に読み込むことができます。 Personクラスと人がのPhoneNumberのコレクションを持っているのPhoneNumberクラスを考えると、次の操作を行うことができます:

List<Person> People = db.People.Where(p => p.Name = "Henry") 
           .Include("PhoneNumbers") 
           .ToList(); 

それともあなたがあなたのエンティティをロードし、.LOADを呼び出して、明示的なロードと呼ばれるものを行うことができますロードする子エンティティおよび関連エンティティのコレクションに関するメソッドです。一般に、LazyLoadingを有効にしていない場合(LazyLoadingは4.0+でデフォルトで有効になっており、以前のバージョンでは呼び出されません)、これを行います。

どのようにクエリして読み込むかにかかわらず、別のコンテキストにアタッチするエンティティを切り離す必要があります。

ここには、かなり良いMSDN article on loading entitiesへのリンクがあります。

+0

あなたの返信ありがとう! – James

+0

問題ありません。あなたに役立つ記事を投票してください。 – CodeWarrior

関連する問題