[entity-framework-4] 가상 키워드가 Entity Framework 4.1 POCO 코드에서 어떤 영향을 미칠 수 있습니까?

virtual키워드가 EF 코드 우선의 속성에 사용될 때 영향을 미칩니 까 ?. 다른 상황에서 모든 파급 효과를 설명 할 수 있습니까?

예를 들어 지연로드를 제어 할 수 있다는 것을 알고 있습니다 . ICollection / 일대 다 관계 속성에서 가상 키워드를 사용하면 기본적으로 지연로드되지만 가상 키워드는 그대로두면됩니다. 열심이다

virtualPOCO 엔터티와 함께 ​​EF에서 키워드가 가질 수있는 다른 효과는 무엇입니까 ? 기본적 virtual으로 모든 속성 을 사용하도록 설정해야합니까 , 아니면 기본 속성 을 사용 하지 않아야합니까?



답변

지금까지 이러한 효과에 대해 알고 있습니다.

  • 지연로드 : virtual특별히 표시하지 않는 한 모든 ICollection은 지연로드됩니다.
  • 보다 효율적인 변경 추적 . 다음 요구 사항을 모두 충족하면 변경 내용 추적에 가상 속성을 연결하여보다 효율적인 방법을 사용할 수 있습니다. 링크에서 :

    변경 내용 추적 프록시를 얻으려면 기본 규칙은 클래스가 공개, 비추 상 또는 비밀 봉 상태 여야한다는 것입니다. 또한 클래스는 유지되는 모든 속성에 대해 퍼블릭 가상 게터 / 세터를 구현해야합니다. 마지막으로 컬렉션 기반 관계 탐색 속성 ICollection<T>만 선언해야합니다 . 구체적인 구현 또는 파생 된 다른 인터페이스 일 수 없습니다 ICollection<T>(지연된로드 프록시와의 차이).

이를 설명하는 또 다른 유용한 링크는 POCO 프록시 생성을위한 MSDN의 요구 사항입니다 .


답변

이 가상 키워드는 엔티티 프레임 워크에서 데이터를로드하는 주제 (지연 한로드, 열성적인로드 및 명시 적로드)와 관련이 있습니다.

지연 로딩으로 데이터를로드 하려면 virtual 키워드를 사용해야합니다 .

지연로드 는 엔티티 또는 엔티티 콜렉션이 처음 액세스 될 때 데이터베이스에서 자동으로로드되는 프로세스입니다.

예를 들어, 아래에 정의 된 블로그 엔티티 클래스를 사용하는 경우 게시물 탐색 특성에 처음 액세스 할 때 관련 게시물이로드됩니다.

public class Blog
{
     public int BlogId { get; set; }
     public string Name { get; set; }
     public string Url { get; set; }
     public string Tags { get; set; }
     public virtual ICollection<Post> Posts { get; set; }
}

Posts 속성을 비가 상으로 설정하여 Posts 컬렉션의 지연로드를 해제 할 수 있습니다.

지연로드가 해제 된 경우에도 간결한로드 (포함 메소드 사용) 또는 관련 엔티티 명시 적로드 (로드 메소드 사용)를 사용하여 게시물 콜렉션로드를 계속 수행 할 수 있습니다.

열심히로드 :

using (var context = new BloggingContext())
{
    // Load all blogs and related posts 
    var blogs1 = context.Blogs
                          .Include(b => b.Posts)
                          .ToList();
}

명시 적으로로드 중 :

using (var context = new BloggingContext())
{
    var blog = context.Blogs.Find(1);

    // Load the posts related to a given blog 
    context.Entry(blog).Collection(p => p.Posts).Load();
}


답변