我创建了两个模型类:Student
和Exam
。
学生:
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
属性时,实体框架应该单独。
答案 0 :(得分:11)
答案 1 :(得分:2)
在c#中,如果你没有声明访问修饰符,默认情况下它会接受它为内部。
您应该将实体类声明为公共类。
其次,集合应返回null旁边的空集合。因此,如果学生没有参加考试,您应该返回空集。那也是你应该改变你的学生建构者。
public class Student
{
public Student()
{
Exams = new List<Exam>();
}
}
修改:如果您有ICollection
或IList
,则ef返回空集合。如果您使用IEnumurable
,则应使用此构造函数。