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

问题描述 投票:0回答:2

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

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

我尝试了一切,没有任何帮助。如果你可以帮我解决这个问题,那将是很棒的,谢谢!

c# asp.net-mvc entity-framework-6 ef-code-first dbcontext
2个回答
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


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>();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.