2011-04-23 6 views
3

코스, 학생 및 교사라는 클래스가Entity Framework Find 메서드가 제대로 작동하지 않습니다.

public class Course 
    { 
     [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
     public Guid CourseId { set; get; } 
     public ICollection<Student> Students { set; get; } 
     public Teacher Teacher { get; set; }  

    } 



public class Student 
    { 
     [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
     public Guid StudentId { set; get; } 
     public ICollection<Course> Courses { set; get; } 
    } 




public class Teacher 
    { 
     [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
     public Guid TeacherId { get; set; } 
     public ICollection<Course> Courses { get; set; } 
    } 

기본 키에 따라 코스를 가져 오는 중입니다.

Course c = _unitOfWork.DbContext.Set<Course>().Find(keyValue); 

데이터베이스에서 코스 개체를 가져 오지만 학생과 코스의 교사 속성은 null입니다.

누락되었습니다. 감사

답변

12

Find 올바르게 작동하기 때문에 EF는 관련 엔티티 자체를로드하지 않습니다. 관련 속성을로드하려면 열망하거나 느린 로딩을 사용해야합니다. 세 번째 옵션은 명시 적 로딩이라고도합니다.

지연로드는 관련 엔티티의 자동로드를 제공하지만 데이터베이스에 대한 추가 쿼리를 생성합니다. 관련 엔터티 또는 관련 컬렉션은 처음 속성에 액세스 할 때로드됩니다. 게으른로드를 사용하려면 엔티티의 모든 탐색 속성을 virtual (@ckal이 예제를 제공)으로 표시해야합니다. 메인 엔티티를로드하는 데 사용 된 컨텍스트가 아직 살아있는 경우에만 지연로드가 작동합니다.

Eager 로딩은 주체와 함께로드되어야하는 관계를 정의합니다. Eager 로딩은 Include 방법으로 실행됩니다.

Course c = _unitOfWork.DbContext 
         .Set<Course>() 
         .Include(c => c.Students) 
         .Include(c => c.Teacher) 
         .SingleOrDefault(c => c.CourseId == keyValue); 

명시 로딩이 명시 적으로 어떤 관계가로드되어야한다고 말할 수 있습니다 : 당신은 Find로 다시 작성할 수 있습니다. 다른 두 가지 방법으로는 불가능한 관련 엔티티를로드하기위한 조건을 정의 할 수도 있습니다. 메인 엔티티를 먼저로드해야하며 컨텍스트를 처리하기 전에 다음과 같이 할 수 있습니다.

context.Entry(course).Collection(c => c.Students).Load(); 
+0

네, 정말 잘됐다 :) –

4

게이밍 로딩을 활성화하려면 내비게이션 속성에 virtual을 추가하십시오.

public class Course 
{ 
    [Key, DatabaseGenerated(DatabaseGenerationOption.Identity)] 
    public Guid CourseId { set; get; } 
    public virtual ICollection<Student> Students { set; get; } 
    public virtual Teacher Teacher { get; set; } 
} 
관련 문제