簡體   English   中英

EF 6編碼優先-一對多映射-ICollection始終為null

[英]EF 6 codde first - One To Many Mapping - 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之后會默認啟用惰性加載,而最有效的解決方案是從實體(非虛擬屬性)中刪除virtual關鍵字。

就我而言,我想在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;
}

我盡一切可能,沒有任何幫助。 如果您能幫助我解決這個問題,那就太好了,謝謝!

您誤會了懶惰加載和渴望加載的工作方式。 這里

將收藏集標記為虛擬只是意味着將其推遲。 刪除它不會填充集合,您仍然需要包括:

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();

更多包括這里的組合。

您應該在構造函數中初始化學生,因為這是班級的職責:

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>();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM