EF 6 codde first - 一对多映射 - ICollection始终为null

时间:2017-12-21 22:50:25

标签: c# asp.net-mvc entity-framework-6 ef-code-first dbcontext

我知道这个问题之前曾多次被问过,但我身边有一种奇怪的行为,我无法得到任何解决方案。

我正在使用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;
}

我尝试了一切,没有任何帮助。如果你能帮助我解决这个问题,那就太好了,谢谢!

2 个答案:

答案 0 :(得分:1)

你误解了懒惰与急切加载的效果。见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

答案 1 :(得分: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>();
    }
}
相关问题