2012-04-11 13 views
13

私はデータベースにアクセスするために、Entity Framework 4.2(コードファースト)を使用しています。私は、SingleOrDefaultを使用してエンティティにクエリを実行した場合、エンティティがまだトラッキングされていない場合にのみデータベースにクエリを実行することを前提としていましたが、このようには見えません。一方、Findメソッドはこれを行うように見えます。 Findの問題は、関連するデータを読み込むことができないように見えることです。エンティティフレームワークコードファーストファインドとシングルオードバウンド(Eager Loading)

Findメソッドを使用する方法はありますか?例として、私はこの本とそのレビューをすべてロードしたい:私は使用して本を得るとき、私はレビューを読み込むことができますSingleOrDefault

// 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); 

を含める:

// 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にしますか?

答えて

11

Findは、キーで単一のエンティティを検索する方法です。 SingleOrDefaultメソッドは、クエリを実行するためのメソッドです。熱心な読み込みは、データベース上で実際に実行されるクエリの一部にすぎないので、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); 
} 
+0

このローカルプロパティが存在しないと考えていませんでした。ありがとう! – Dismissile

+0

こんにちは、操作の速度に関して、Find to SingleOrDefaultはエンティティ情報を取得しますか? – Patrick

0

遅延読み込みを有効にすると、Findが機能します。これを試してください:

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

"n"変数の値を確認してください。 EFは初めてコレクションにアクセスするときにコレクションをロードする必要があります。

+2

彼のポイントは、彼が遅延ロードを使用したくないということであると、ロードされた彼らは熱心に望んでいます。 –

関連する問題