18

データベースにアクセスするために Entity Framework 4.2 (Code First) を使用しています。SingleOrDefaultエンティティを使用してクエリを実行すると、エンティティがまだ追跡されていない場合にのみデータベースをクエリすると想定していましたが、そうではないようです。一方Find、メソッドはこれを行っているようです。問題Findは、関連するデータをロードできないように見えることです。

メソッドを使用するFindだけでなく、熱心にデータをロードする方法はありますか? 例として、本とそのすべてのレビューをロードしたいとします。

// Load book from the database
Book book = context.Books.Find(1); 
context.Entry<Book>(book).Collection<Review>.Load(); // Book.Reviews is now populated

// Load book from the change tracker
// This will include all Reviews as well
Book book2 = context.Books.Find(1);

SingleOrDefaultインクルードを使用して本を取得したときにレビューを読み込むことができます。

// Load book + reviews from the database
Book book = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1);

// Doing the same thing again requeries the database
Book book2 = Book.Include("Reviews").SingleOrDefault(b => b.Id == 1);

Findの熱心な読み込みでの動作を取得する方法はありSingleOrDefaultますか?

4

2 に答える 2

15

Findメソッドは、単一のエンティティをキーで検索するためのものです。SingleOrDefaultメソッドは、クエリを実行するためのものです。Eager ローディングは、データベース上で実際に実行されるクエリの一部にすぎないため、 では使用できませんFind

回避策として、次のように書き直すことができます。

// This will check only on in-memory collection of loaded entities
Book book = context.Books.Local.SingleOrDefault(b => b.Id == 1);
if (book == null)
{
    book = context.Books.Include(b => b.Review).SingleOrDefault(b => b.Id == 1);
}
于 2012-04-11T19:44:27.513 に答える
0

遅延読み込みが有効になっている場合、検索が機能します。これを試して:

Book book = context.Books.Find(1);
int n = book.Reviews.Count;

「n」変数の値を確認してください。EF は、最初にアクセスするときにコレクションを読み込む必要があります。

于 2012-04-11T19:15:46.303 に答える