2012-04-11 7 views
13

데이터베이스에 액세스하기 위해 Entity Framework 4.2 (코드 우선)를 사용하고 있습니다. 나는 만약 엔티티가 이미 추적되고 있지 않다면 SingleOrDefault을 사용하여 엔티티에 질의를하면 데이타베이스를 조회 할 것이라는 가정하에 있었지만 이것이 사실 인 것처럼 보이지는 않습니다. 반면에 Find 메서드는이 작업을 수행하는 것으로 보입니다. Find의 문제점은 관련된 데이터를로드 할 수 없다는 것입니다.Entity Framework 코드 첫 번째 찾기 대 SingleOrDefault (열렬한로드 중)

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

방법에 있는가 열심히로드가 SingleOrDefaultFind의 동작을 얻으시겠습니까?

답변

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

안녕하세요, 그리고 작업의 속도에 관한, 엔티티 정보를 얻기 위해 찾기 대 SingleOrDefault? – Patrick

0

지연로드가 사용 가능한 경우 찾기가 작동합니다. 이것을 시도하십시오 :

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

"n"변수의 값을 확인하십시오. EF는 처음 액세스 할 때 컬렉션을로드해야합니다.

+2

그 점은 그가 게으른 로딩을 사용하지 않고 그들이 열망로드 싶어합니다 : 당신이 이런 식으로 다시 쓸 수있는 해결 방법으로

. –

관련 문제