2017-12-21 50 views
0

이 질문은 여러 번 전에 물어 보았지만 내 측면에서는 이상한 행동을 보였으며 어떤 해결책도 얻을 수 없었습니다.EF 6 코드 첫 번째 - One To Many 매핑 - ICollection always null

저는 먼저 EF6 및 코드가있는 .Net 응용 프로그램을 구축하고 있습니다.

public class Student 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int RefId { get; set; } 

    public int GradeId { get; set; } 
    public Grade Grade { get; set; } 
} 

public class Grade 
{ 
    private string _name; 

    public int GradeId { get; set; } 
    public string GradeName { get; set; } 

    public ICollection<Student> Students { get; set; } 
} 

내가 게으른 로딩 EF 4 이상 기본적으로 활성화되어 있음을 이해하고, 대부분의 작업이 솔루션이를 제거하기 위해 다음과 같이 나는 (이 예 클래스하지만 나는 정확히 같은 구조를 가지고) 내 클래스를 정의 엔티티의 가상 키워드 (비 가상 속성).

제 경우에는 Grade 클래스의 getter 메소드에서 사용자 정의 코드를 설정하려고하지만 ICollection<Student> Students은 항상 null입니다. 예를 들어

: 나는 가능한 모든 노력을

public string GradeName 
{ 
    get 
    { 
     _name = Students.FirstOrDefault(s => s.GradeId == GradeId && 
           s.RefId == 2).Name; 

     if (string.IsNullOrWhiteSpace(_name)) 
     { 
      _name = Name; 
     } 

     return _name; 
    } 

    set => _name = value; 
} 

, 아무것도 도움이되지 않습니다. 이 문제를 해결하는 데 도움을 주시면 대단합니다. 이 클래스의 책임으로

+0

'public' ** 가상 **'ICollection 학생 {get; 세트; }' –

+0

이것은 작동하지 않았습니다. getter 메소드 GradeName에서 Students는 항상 null입니다! –

+0

'GradeName'을 호출하는'Grade' 인스턴스가 컨텍스트에서 가져 왔습니까? –

답변

0

당신은 생성자에서 학생들을 초기화한다 : 당신은 오해하는

public class Grade 
{ 
    public int GradeId { get; set; } 
    public string GradeName { get; set; } 

    public ICollection<Student> Students { get; set; } 

    public Grade() 
    { 
     Students = new Collection<Student>(); 
    } 
} 
+0

이것은 null 참조 예외를 제공하지 않도록 컬렉션을 초기화하지만 관련 데이터를 포함하지 않습니다. 나는 이미 그것을 시도했다 –

0

얼마나 게으른 열망 로딩 작품을 대. here을 참조하십시오.

컬렉션 가상에 표시하는 것은 지연된다는 것을 의미합니다. 이 컬렉션을 채우지 않습니다 제거, 여전히이 포함해야

var studentWithGrade = context.Students 
      .Include(s => s.Grade) 
      .FirstOrDefault(s => s.GradeId == GradeId && s.RefId == 2); 

또는 학생 컬렉션 등급 :

var gradeWithStudents = context.Grade 
      .Include(g => g.Students) 
      .ToList(); 

더는 조합 here을 포함한다.

+0

대답 주셔서 감사합니다,하지만 어떻게 내 사건에 포함을 사용할 수 있습니다. 나는 getter 방법을 의미합니다. 학생들은 항상 null입니다. getter 메소드에서 그것을 사용하기 위해 어떻게 채울 수 있습니까? 제 질문을 다시보십시오. 이 단계에서 컨텍스트 개체가 없습니다 –

+0

당신이 성취하려는 것을보고 있지 않습니다. Students.FirstOrDefault()를 참조하십시오. 인구는 어디에 있습니까? –

+0

내가 전에 쓴 주석을 붙이면 내가 성취하고자하는 것을 알게 될 것이다. –