【发布时间】:2015-07-26 18:06:57
【问题描述】:
我有两个使用 virtual 关键字连接的类:
学生:
public class Student
{
public int StudentId{get; set;}
public string LastName { get; set; }
public string FirstName { 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 decimal? Grade { get; set; }
public virtual Course course { get; set; }
public virtual Student student { get; set; }
}
两个表都已填充,并具有相应的记录(例如,有一个 id 为 1 的学生和一个 id 为 1 的学生的注册)。
我正在通过它的 id 拉出一个学生并将其发送到一个视图
Student student = db.Students.Find(id);
return View(student);
在视图中,我可以显示该学生的详细信息。 @Model 确实包含 Enrollment 属性(至少它出现在智能感知中并且没有红线),但它是 Null。
还有一门课程:
{
public int CourseId { get; set; }
public String CourseName { get; set; }
public int TotalCredits { get; set; }
}
由于@Model.Enrollments 是Null,我无法访问@Model.Enrollment.CourseNamae。
编辑: 我刚刚尝试了一个黑客解决方法:
IEnumerable<Student> temp = db.Students.Include(s => s.Enrollments);
Student student = temp.FirstOrDefault(s => s.StudentId.Equals(id));
return View(student);
这给了我第二行的错误:
System.InvalidOperationException:指定的包含路径无效。 EntityType“MyFirstProject2.Models.Student”未声明名为“Enrollments”的导航属性。
这有什么线索吗?
【问题讨论】:
-
尝试快速加载
Enrollment(即db.Students.Include(s => s.Enrollments).Find(id);) -
谢谢你提醒我,我所做的显然是所谓的“延迟加载”。
-
我收到了
Error 1 'System.Linq.IQueryable<MyFirstProject2.Models.Student>' does not contain a definition for 'Find' and no extension method 'Find' accepting a first argument of type。我正在学习一个教程,他们正在尝试演示延迟加载,但我很乐意让它工作。 -
您需要将
using System.Data.Entity;添加到班级顶部。.Include是一种扩展方法。 -
它有,而且很容易找到
.Include。例如,我可以通过IEnumerable<Student> temp = db.Students.Include(s => s.Enrollments);获取学生名单。但是我需要为IEnumerable使用查找方法,我可以这样做,但似乎我应该能够让至少一个急切或延迟加载方案工作。
标签: asp.net asp.net-mvc entity-framework