언제 EF에 포함을 사용합니까? 투영에 필요하지 않습니까?

entity-framework entity-framework-core

문제

Entity Framework Core에는 다음과 같은 항목이 있습니다.

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 => ...

Entity Framework에 Include를 사용해야합니까?

최신 정보

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

수락 된 답변

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

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

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

EF가 생성하는 SQL 쿼리를 확인할 수 있습니다. 그러면 쿼리가 명확 해집니다. 하나의 SQL 쿼리 만 보입니다.


인기 답변

하위 항목을 Include 하면 원본 쿼리의 일부로로드되어 하위 항목이 커집니다.

쿼리에 다른 방식으로 자식을 Include 하거나 참조하지 않으면 초기 결과 집합은 더 작지만 나중에 참조하는 각 자식은 새 요청을 통해 데이터베이스에 지연로드됩니다.

하나의 요청으로 1000 명의 사용자를 반복 한 다음 각각 10 장의 사진을 요청하면 자녀를 Include 시키지 않으면 1001 개의 데이터베이스 요청을합니다 ...

또한 지연로드는 컨텍스트가 삭제되지 않았 음을 요구합니다. 예를 들어 UI 렌더링을 위해 뷰에 엔터티를 전달할 때 항상 불쾌한 결과가 발생합니다.

업데이트 예를 들어 이것을 시도해보십시오. 실패합니다.

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

다음을 시도하십시오.

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


Related

아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow