4

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

前もって感謝します!

4

2 に答える 2

8

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

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

于 2011-12-14T09:52:36.760 に答える
3

子エンティティをロードする方法を尋ねていますか?その場合は、.Includeメソッドを使用して熱心な読み込みを行うことができます。PersonクラスとPersonがPhoneNumberのコレクションを持つPhoneNumberクラスがある場合、次のように実行できます。

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

または、エンティティをロードして、ロードする子および関連エンティティのコレクションに対して.Loadメソッドを呼び出す、いわゆる明示的ロードを実行できます。通常、これはLazyLoadingが有効になっていない場合に行います(4.0以降ではLazyLoadingがデフォルトで有効になっているため、以前のバージョンでは思い出せません)。

クエリとロードの方法に関係なく、別のコンテキストにアタッチするエンティティをデタッチする必要があります。

これは、エンティティのロードに関する非常に優れたMSDN記事へのリンクです。

于 2011-12-14T03:50:01.733 に答える