2

Entity Framework モデルに2 つのテーブルがKittensあります。OwnersAKittenは 1Ownerですが、anは複数の sOwnerを持つことができますKitten

GetKittens()返すというリポジトリメソッドがあります_context.Kittens.ToList();

アソシエーションを組んだからできることkitten.Owner.Name

しかし、ToList() は既に呼び出されており、コンテキストは破棄されているため、どのようにプロパティにアクセスするのでしょうか? エンティティを取得するとき、関連付けを持つすべてのテーブルに結合しますか?

4 つのテーブルからデータを取得するクエリを作成する必要があるため、これを効率的に行う方法を考えているため、この質問は EF のしくみについてもう少し理解しようとしています。

4

1 に答える 1

2

デフォルトでは、 aDbContextは遅延読み込みを使用します。ユースケースに応じて、いくつかのオプションを利用できます。

1- の寿命を管理できる場合は、DbContext処分しないでください。ただし、関連するエンティティに (初めて) アクセスするたびに、新しいクエリがデータベースに送信されて取得されます。

Include2- で使用することにより、関連するエンティティを熱心に含めますIQueryable<Kitten>

// For imagine context is the DbContext for your EF Model
context.Kittens.Include(c => c.Owners); // Or Include("Owners")

ただし、リポジトリを制御できない場合はIEnumerable<Owner> GetOwners(Kitten kitten)、リポジトリが既にリストを返しているため、リポジトリの関連メソッド ( など) を呼び出すしかありません。

その場合は、実体化する前に子猫の所有者を積極的にリポジトリに含めるかToList()、IQuerable を返し、関連するエンティティを含めるか、クエリをカスタマイズする責任を呼び出し元のクラスに任せることを検討してください。呼び出し元がクエリを変更できないようにする場合は、次のようなインクルードを含むオーバーロードを追加できます。

public List<Kitten> GetKittens(params string[] includes)
{
    return includes.Aggregate(
               context.Kittens.AsQueryable(), 
               (query, include) => return query.Include(include)).ToList();
}

全体として、これは実行する必要がある実装上の決定です。

于 2013-06-25T16:49:09.247 に答える