延迟加载不在EntityFramework Core中工作

时间:2017-04-02 18:31:17

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

以下是使用Code First Entity Framework(DbContext)控制数据库表的两个类。

public class Employee
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string EmployeeName { get; set; }

    public int DepartmentId { get; set; }

    public Department Department { get; set; }

}

-

public class Department
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    public string DepartmentName { get; set; }
}

如果我使用以下行检索员工,Department的导航属性为null:

        var employees = _context.Employees.ToList();

但是,如果我首先使用Departments填充单独的变量,就像这样......

        var departments = _context.Departments.ToList();

        var employees = _context.Employees.ToList();

... employees列表中的每位员工都包含部门对象。

我的问题: 填充导航属性的最佳做法是什么?我曾想过Entity Framework默认会这样做,而ToList()方法会处理延迟加载。

2 个答案:

答案 0 :(得分:3)

阅读docs / roadmap您已经意识到EF Core 1.0 / 1.1尚不支持延迟加载。

目前仅支持.Include或急切加载,文档中都有详细说明。

您不能假设EF Core中的所有功能都可用于EF Core。 EF Core是完全重写,并不包含EF6的许多功能。如果你需要任何这些东西,你应该继续使用EF6。

EF Core足以满足大多数简单/基本的ORM需求,但即使是微软也建议您在依赖这些功能的情况下使用EF6进行生产。

答案 1 :(得分:1)

我使用UseLazyLoadingProxies解决了EF Core 2.1中的问题:

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        => optionsBuilder
        .UseLazyLoadingProxies();

您现在需要手动指定要启用它。