导航属性没有得到延迟加载
问题描述:
我正在尝试在mvc官方网站上给出的mvc示例上的动手。 在这里,我有3个模型学生,课程和注册,在课程和注册实体之间存在一对多关系,并在注册和学生中建立多对一的关系。是导航属性没有得到延迟加载
的学生,课程和招生模式与导航属性标记为“虚拟”的,因为我需要执行延迟绑定
public class Student
{
public int StudentID { get;set; }
public string LastName { get; set; }
public string FirstMidName { get; set; }
public DateTime EnrollmentDate { get; set; }
public virtual IEnumerable<Enrollment> Enrollments { get; set; }
}
以同样的方式,我有我的课程模式如下
我报名型号
public class Enrollment
{
public int EnrollmentID { get; set; }
public int CourseID { get; set; }
public int StudentID { get; set; }
// public Grade? Grade { get; set; }
public virtual Course Course { get; set; }
public virtual Student Student { get; set; }
}
我使用代码优先技术随着EF 5.My DB上下文类是如下
public class SchoolContext:DbContext
{
public DbSet<Student> Students { get; set; }
public DbSet<Enrollment> Enrollments { get; set; }
public DbSet<Course> Courses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
}
}
脚手架我已经生成的所有我的看法。对我的点击详细操作环节我有一个被称为
public ActionResult Details(int id = 0)
{
db.Configuration.LazyLoadingEnabled = true;
db.Configuration.ProxyCreationEnabled = true;
Student student = db.Students.Find(id);
// db.Entry(student).Reference(p => p.Enrollments).Load();
IEnumerable<Enrollment> s= student.Enrollments;
if (student == null)
{
return HttpNotFound();
}
return View(student);
}
这里的问题是,当查找()方法被调用的控制器功能控制器的Student类模型中的导航属性为null。但DB中的数据对应于正在传递的id。简而言之,导航属性不返回数据(null)。
答
你必须兑现的实体,以获得摆脱目前的延迟加载在查询:
Student student = db.Students.Find(id).ToList();
这将db.Students.Find(ID)后解决您的问题,而ToList(); =会从动态代理中返回生成的对象。
问题二你有铸造缺陷:
IEnumerable<Enrollment> enrollments = student.Enrollments; // is wrong
应该是:
ICollection<State> enrollments = student.Enrollments;
或
var enrollments = student.Enrollments;
+0
我不清楚这个答案。请你详细说明..Here Find()方法返回一个类型为Student的对象并将其转换为Enumerable类型会引发编译时错误。 –
使用'.INCLUDE()'...参考[这里] (http://stackoverflow.com/questions/26661771/what-does-include-do-in-linq)和[this](http://stackoverflow.com/questions/5648154/include-in-linq-to-实体 - 查询)帖子。 –
这很好.....但我更喜欢延迟加载。请告诉我我在哪里做错了。 –
尝试修改你的学生类,通过创建一个构造函数并添加以下内容。注册= new Hashset(); –
uk2k05