【问题标题】:MVC4 tutorial - Eager loading of a property of a foreign key object, that has itself been eager loadedMVC4 教程 - 急切加载外键对象的属性,该对象本身已被急切加载
【发布时间】:2013-11-08 23:12:10
【问题描述】:

我正在使用 MVC4 和 EF5,并且一直在学习此页面上的 Contoso 大学教程: http://www.asp.net/mvc/tutorials/getting-started-with-ef-5-using-mvc-4/implementing-basic-crud-functionality-with-the-entity-framework-in-asp-net-mvc-application

实体框架模型类的相关部分:

public class Student
{
    public int StudentID { get; set; }
    public string LastName { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

public enum Grade { A,B,C,D,F}
public class Enrollment
{
    public int EnrollmentID { get; set; }
    public int CourseID { get; set; }
    public int StudentID { get; set; }
    public Grade? Grade { get; set; }
    public Course Course { get; set; }
    public Student Student { get; set; }
}

public class Course
{
    public int CourseID { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Enrollment> Enrollments { get; set; }
}

在控制器中:

public ActionResult Details(int id = 0) {
    Student student = db.Students.Find(id);
    return View(student);
}

视图的相关位:

@foreach (var item in Model.Enrollments) {
    <tr>
    <td>
        @Html.DisplayFor(modelItem => item.Course.Title) //this does not display as Course is null
    </td>
    <td>
        @Html.DisplayFor(modelItem => item.Grade)
    </td>
    </tr>
}

与教程所说的相反,对我来说,视图不显示课程标题,它只显示成绩。

Course Title    Grade
                A
                C
                B

调试显示 Course 属性(表示 Course 的外键)为空。 换句话说,对于每个学生,已加载 Enrollments 集合,但这些注册尚未加载其 Course 属性。 我无法弄清楚如何使用 Eager Loading 来加载每个 Enrollment 的 Course 属性。 如何让课程标题显示在视图中?

我发现硬编码的“包含”字符串可以工作(在控制器中):

Student student = db.Students.Where(x => x.StudentID == id).Include("Enrollments.Course").Single();

但我不知道如何使用 lambda 函数或任何其他函数来实现。

我尝试了以下方法但没有成功:

Student student = db.Students.Where(x => x.StudentID == id).Include(y => y.Enrollments.Course).Single();
Student student = db.Students.Where(x => x.StudentID == id).Include(y => y.Enrollments).Include(z => z.Enrollments.Course).Single();

【问题讨论】:

  • 是否填充了课程 ID?
  • 是的。在学生对象的 Enrollments 集合中,除了 Course 之外的所有属性都被填充。所以 CourseID、EnrollmentID、Grade、Student 和 StudentID 都不为空

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

不要在你的 c# 文件中忘记这一点:

using System.Data.Entity;

编辑:

或者只是将您的课程属性标记为虚拟以进行延迟加载

public class Enrollment
{

        public virtual Course Course { get; set; }
        public virtual Student Student { get; set; }
}

【讨论】:

  • 感谢您的回复,不幸的是它不起作用,因为“y => Enrollments.Course”有编译器错误:“无法将lambda表达式转换为'string'类型,因为它不是委托类型”。所以换句话说,它和我用'z'做的时候是一样的。
  • 是的,它包含在顶部。 Visual Studio 2012 中没有红色波浪线。在您的建议中,只有“(y => Enrollments.Course)”带有下划线
  • 糟糕。抱歉,这是一个语法错误。将其更改为y =&gt; y.Enrollments.Course
  • 我也应该发现这一点,但它仍然给出相同的编译器错误。我认为这是因为 Enrollments 是一个集合,因此它没有 Course 属性。
  • 对。要解决您的问题,只需按照教程中的说明将 virtual 关键字添加到您的 Enrollment 模型的模型属性中即可。检查我的编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多