【问题标题】:Lazy loading not working in Entity Framework延迟加载在实体框架中不起作用
【发布时间】: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.EnrollmentsNull,我无法访问@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 =&gt; s.Enrollments).Find(id);
  • 谢谢你提醒我,我所做的显然是所谓的“延迟加载”。
  • 我收到了Error 1 'System.Linq.IQueryable&lt;MyFirstProject2.Models.Student&gt;' 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&lt;Student&gt; temp = db.Students.Include(s =&gt; s.Enrollments); 获取学生名单。但是我需要为IEnumerable 使用查找方法,我可以这样做,但似乎我应该能够让至少一个急切或延迟加载方案工作。

标签: asp.net asp.net-mvc entity-framework


【解决方案1】:

有点晚了,但是Lazy Loading vs Eager Loading之间有一些解释

还有延迟加载的规则

  1. context.Configuration.ProxyCreationEnabled 应该为 true。
  2. context.Configuration.LazyLoadingEnabled 应该为真。
  3. 导航属性应定义为公共的、虚拟的。如果属性未定义为,上下文将不会进行延迟加载 虚拟的。

编辑: 关系使用的最后一件事:

public virtual ICollection<Enrollment> Enrollments { get; set; }

其他链接:

Lazy Loading

Eager Loading

Explicit Loading

【讨论】:

  • 感谢您的解释。在关于急切加载的评论之后,我出去阅读了一些关于差异的内容。但是,我的问题是它不起作用。我正在浏览视频教程,我又浏览了四次,我很确定我的所有代码都是正确的。加载只是没有发生 - Enrollments 属性为空。我的代码是否提供了有关原因的任何线索?
  • 等等,我没注意编辑(或者我们越界了)。就是这样。现在我需要了解ICollectionIEnumerable 之间的区别。
  • @abalter 很乐意提供帮助,我使用 EF 作为日常 DB 访问技术,但您必须进行大量研究;不用担心它是一个非常酷的访问数据库的框架,而且关系需要一段时间才能理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多