我试图在ASP.Net MVC应用程序中了解延迟加载。例如,我有一个具有属性的类(Employees)。我希望集合只在我需要加载时加载:
public class Department
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int DepartmentId { get; set; }
public string DepartmentName { get; set; }
[ForeignKey("DepartmentId")]
public Lazy<ICollection<Employee>> Employees { get; set; }
}
首先,我不确定是否应该延迟加载类或集合
public Lazy<ICollection<Employee>> Employees { get; set; }
public ICollection<Lazy<Employee>> Employees { get; set; }
我假设收藏。
接下来,我似乎找不到一个相关的例子来实际加载属性/集合,一旦我需要它并在实例化类之后。我也不确定这是在类本身还是在我的MVC控制器中完成的。
感谢任何帮助。
答案 0 :(得分:1)
对于延迟加载,您必须:
public virtual ICollection<Lazy<Employee>> Employees { get; set; }
。你实际上错过了允许框架通过覆盖属性来创建代理的virtual
; context.Configuration.ProxyCreationEnabled = true;
,这是defautl值。答案 1 :(得分:1)
您不必使用Lazy<T>
媒体资源上的Employees
。你只是添加了不必要的“懒惰”,因为实体框架(以及其他ORM,如NHibernate)查询已经是懒惰的,即:当你明确地告诉它时,查询只会命中数据库。
所以,通过使Employees
类型:
public virtual ICollection<Employee> Employees { get; set; } //make sure to mark it as virtual, otherwise it won't be lazy
查询时:
var result = myContextObj.Departments.Include(d=> d.Employees).Where(d=> d.Id == someID).SelectMany(d=> d.Employees);
上面的代码除了创建一个表示可以发送到数据库的查询的查询对象之外什么也没做。但它不会做任何事情,除非你通过执行foreach
来“实现”结果。 result
,或致电ToList()
。