实体框架6延迟加载不起作用

时间:2016-03-22 15:51:48

标签: c# entity-framework entity-framework-6

我创建了两个模型类:StudentExam

学生:

class Student
{
    [Key]
    public int StudentId { get; set; }

    [Required, MaxLength(30)]
    public string FirstName { get; set; }

    [Required, MaxLength(50)]
    public string LastName { get; set; }

    [Required]
    public DateTime BirthDate { get; set; }

    public virtual ICollection<Exam> Exams { get; set; } 
}

考试:

public enum Grade
{
    A, B, C, D, E, F
}
class Exam
{
    [Key]
    public int ExamId { get; set; }

    [Required]
    public Grade Grade { get; set; }

    [ForeignKey("Student"), Required]
    public int StudentId { get; set; }

    public virtual Student Student { get; set; }
}

但似乎Lazy Loading不起作用,这是我检索数据的示例:

using (var context = new StudentContext())
{
    context.Configuration.LazyLoadingEnabled = true;
    context.Configuration.ProxyCreationEnabled = true;

    var student = context.Students.Single(s => s.LastName == "ABC");

    foreach (var exam in student.Exams)
    {
        Console.WriteLine($"{exam.ExamId}: {exam.Grade}");
    } 
    context.SaveChanges();
}

当我尝试访问NullReferenceException属性时,我收到students.Exams。我的代码有什么问题?

我的代码的问题是实体框架延迟加载不起作用,我不知道为什么。这不是关于不初始化Exams,因为当我尝试访问Exams属性时,实体框架应该单独

2 个答案:

答案 0 :(得分:11)

您没有按照the rules启用实体框架来创建需要公共访问权限的代理(延迟加载所需):

  

必须使用公共访问声明自定义数据类。

让您的ExamStudent公开,它应该有用。

答案 1 :(得分:2)

在c#中,如果你没有声明访问修饰符,默认情况下它会接受它为内部。

您应该将实体类声明为公共类。

其次,集合应返回null旁边的空集合。因此,如果学生没有参加考试,您应该返回空集。那也是你应该改变你的学生建构者。

 public class Student
    {
        public Student()
        {
            Exams = new List<Exam>();
        }
    }

修改:如果您有ICollectionIList,则ef返回空集合。如果您使用IEnumurable,则应使用此构造函数。