填充惰性<T> collection

Populating a Lazy<T> collection

我正在努力解决 ASP.Net MVC 应用程序中的延迟加载问题。例如,我有一个 class 和一个 属性,即 collection(员工)。我希望 collection 仅在我需要加载时加载:

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; }
}

首先,我不确定是否应该延迟加载 class 或 collection

    public Lazy<ICollection<Employee>> Employees { get; set; }
    public ICollection<Lazy<Employee>> Employees { get; set; }

我假设 collection。

接下来,我似乎无法找到一个相关的例子来实际加载 property/collection 一旦我需要它并且在 class 被实例化之后。我也不确定这是在 class 本身还是在我的 MVC 控制器中完成的。

感谢任何帮助。

对于延迟加载,您必须:

  • public virtual ICollection<Lazy<Employee>> Employees { get; set; }。您实际上错过了允许框架通过覆盖 属性;
  • 创建代理的 virtual
  • context.Configuration.ProxyCreationEnabled = true;,这是默认值。

您不必在 Employees 属性 上使用 Lazy<T>。您只会添加不必要的 "lazyness",因为 Entity Framework(以及其他 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);

上面的代码除了创建一个表示可能被发送到 database.But 的查询的查询对象之外什么都不做,它不会做任何事情,除非你 "materialize" 结果,或者通过执行例如 foreach result,或致电 ToList()