2016-06-28 5 views
2

I 엔티티 프레임 워크 핵심에 다음과 같습니다언제 EF에 포함 시키시겠습니까? 투영에 필요하지 않습니까?

public class Book { 
    public Int32 Id { get; set; } 
    public String Title { get; set; } 
    public virtual Theme Theme { get; set; } 
} 

public class Theme { 
    public Int32 Id { get; set; } 
    public String Name { get; set; } 
    public Byte[] Illustration { get; set; } 
    public virtual ICollection<Ebook> Ebooks { get; set; } 
} 

그리고 나는 다음과 같은 LINQ 쿼리 한 :

List<BookModel> books = await context.Books.Select(x => 
    new BookModel { 
    Id = x.Id, 
    Name = x.Name, 
    Theme = new ThemeModel { 
     Id = x.Theme.Id, 
     Name = x.Theme.Name 
    } 
    }).ToListAsync(); 

내가 에 필요하지 않았다가 테마 포함이 일을하기 위해, 예를 들어, :

List<BookModel> books = await context.Books.Include(x => x.Theme).Select(x => ... 

언제 Include in Entity Framework를 사용해야합니까?

UPDATE

는 I 테마 그림 유형 Byte []의 열을 추가했다. 내 예상에서 나는 그 열을 포함하지 않기 때문에 Include를 사용하면로드 될 것인가? 또는 투영에 포함시키지 않으면로드되지 않습니까?

+0

'await context.Books.Include (x => x.Theme) .ToListAsync();'를 사용하면 동일한 결과 집합을 얻을 수 있습니다. –

답변

3

자식이 Include 인 경우 원래 쿼리의 일부로로드되어 더 커집니다.

Include이 아니거나 쿼리에서 다른 방식으로 참조하는 경우 초기 결과 집합은 더 작지만 나중에 참조 할 각 자식은 새 요청을 통해 데이터베이스에 지연로드됩니다. 다음 1000 하나 개의 요청에 사용자와 통해 루프가 각각 자신의 10 개 사진을 요청하는 경우가 Include 아이하지 않으면

, 당신은

또한, 게으른 로딩 문맥을 필요로 ... 1001 개 데이터베이스 요청을 할 것입니다 처분되지 않았습니다. 예를 들어 UI 렌더링을 위해 뷰에 엔터티를 전달할 때 항상 불쾌한 결과가 발생합니다.

갱신 예를 들어이 시도하고 실패 참조 :

var book = await context.Books.First(); 
var theme = book.Theme; 

다음이 시도 : 당신은 EF 컨텍스트 내부에서 작업했기 때문에

var book = await context.Books.Include(b => b.Theme).First(); 
var theme = book.Theme; 
+0

게으름로드 (https://github.com/aspnet/EntityFramework/issues/3312)가없는 Entity Framework Core를 사용 중입니다 ... Inf 사실 내가 게으른로드를 사용하지 않습니다 ...그래서 내 코드 또는 설명에 뭔가 빠졌습니까? –

+1

코어를 사용하지 못했습니다. 그래도 쿼리는 테마를 직접 참조하므로 데이터가로드됩니다. 네가 ref. 테마가 쿼리에 있지만 구체화 된 엔터티의 탐색 영역에 액세스하려고하면 쿼리에 포함해야합니다. –

+1

차이점을 표시하는 코드로 나의 대답을 업데이트했습니다. –

1

당신은 포함이 필요하지 않았다. 당신이 만드는 익명의 객체 내부에서 Theme를 참조 할 때, 그것은 느린 로딩을 사용하지 않는 것이고, 그것은 EF에게 참여를 말합니다.

책 목록을 반환하고 테마를 포함하지 않으면 테마를 가져 오려고하면 해당 항목이 null이라는 것을 알게됩니다. EF 연결이 열려 있고 게으른로드가 있으면 DB로 이동하여 가져옵니다. 그러나 연결이 열리지 않으면 명시 적으로 이해해야합니다.

반면에 Include를 사용하면 데이터를 즉시 가져옵니다. 후드 아래에서 필요한 테이블에 조인을하고 바로 데이터를 가져옵니다.

EF가 생성하는 SQL 쿼리를 확인하면 더 명확하게 처리 할 수 ​​있습니다. 하나의 SQL 쿼리 만 보입니다.

+0

Lazy Loading을 지원하지 않는 EF 7을 사용하면서 Lazy Loading을 사용하지 않으므로 코드에 포함 여부와 사용 방법의 차이점은 무엇입니까? 예를 들어 Include를 사용하지 않아야합니까? 예를 들어, 해당 하위 엔티티의 열 중 하나가 크고 필요하지 않은 경우? –

+0

게으른 로딩을 사용하여 데이터를 가져오고 있다고 말하지 않았습니다. EF는 하나의 SQL 쿼리 만 생성합니다. 익명의 개체를 만들 때 테마를 언급하기 때문에 EF가 참여하고 있다고 말했습니다. 그것은 여전히 ​​SQL 쿼리가 실행되기 전입니다. –

+0

업데이트를 추가했습니다 ... 테마 열이 투영되지 않으면 포함을 사용하면로드됩니까? 그것이 내가 두려워했던 것입니다. –