1

背景: EF4とを使用していObjectContextます。複雑なオブジェクト階層の取得を最適化するために、データベースクエリを手動で実行してから、を使用ObjectContext.Translatey<T>(DataReader, entitySetName, mergeOptions.AppendOnly)してデータ行をエンティティに変換します。ObjectContext次に、エンティティをwithAttachメソッドにアタッチします。これにより、エンティティ間の関係も修正されます。

問題: すべてがロードされてセットアップされた後、親エンティティから子エンティティ(たとえば、Parent.Childs.First())に移動しようとしますが、すべての子エンティティがObjectContextとEntitySetにすでに存在します。これは、parent.Childs.IsLoadedがfalseに設定されているため、EFがリレーションをロードする必要があると見なしているためと思われます。

質問: EntitySetがすでにロードされていることをEFに伝えるにはどうすればよいですか?

RelatedEnd.IsLoadedtrueに設定するためのサポートされている方法はありますか?RelatedEnd.SetIsLoaded内部メソッドの呼び出しを台無しにしたくありません。

私はここでちょっとした質問を見つけましたが、それはDbContextに関連していて、満足のいく答えはありません;-)

マトラ

4

2 に答える 2

1

これはこの変更で実装されたようです:http: //entityframework.codeplex.com/workitem/269

これで、エンティティを反復処理して、子コレクションがすでにロードされていることをエンティティに伝えることができます。

foreach (var entity in loadedEntities)
  context.Entry(entity).Collection(a => a.SomeChildCollection).IsLoaded = true;

SomeChildCollectionこれにより、からアクセスしたときにエンティティが読み込まれるのを防ぐことができますentity

これがどのバージョンのEFに登場したかは正確にはわかりませんが、6.0.0だと思います。

于 2014-01-27T04:32:43.680 に答える
0

これを解決する唯一の方法は、遅延読み込みをオフにすることです。MSDNで見つけた質問について尋ねられますDbContextが、その答えは、基になるライブラリの値を変更する方法がないことを示しています。ObjectContextAPI(=この場合はEF4)が基になるライブラリです。.NET 4.5(EF5)IsLoadedでも、パブリックAPIでは設定を利用できません。

于 2013-02-18T19:30:51.517 に答える