实体框架7包含()未按预期工作

时间:2016-03-21 13:04:18

标签: entity-framework entity-framework-core

即使没有请求,EF7也会填充包含的导航属性。例如,我有以下实体。

public class Employee
{
    public int EmployeeId { get; set; }
    public string Name { get; set; }
    public string Gender { get; set; }
    public int DepartmentId { get; set; }
    public Department Department { get; set; }
}

public class Department
{
    public int DepartmentId { get; set; }
    public string Name { get; set; }
    public ICollection<Employee> Employees { get; set; }
}

我的获取查询如下。

ctx.Employees.Where(e => e.Gender == "Male").Include(e => e.Department)

我获得Department对象填充的Employee属性 - 这与我Include Department的预期相同。我发现Department.Employees也是填充但部分(仅限男性员工)。我没有为Include指定Department.Employees,但它仍在填充。这种行为是设计的吗?有没有办法避免在这种情况下提取Department.Employees

我使用的是版本为7.0.0-rc1-final的EF7 NuGet包。

1 个答案:

答案 0 :(得分:3)

这是EF的正常行为。执行查询时,您加载的所有实体都将附加到您的上下文。因此,EF不会执行另一个查询并部分加载Department.Employees,这些员工在执行查询时会更早加载。总而言之,当您咨询Department.Employees导航属性时,EF将使用您Gender的查询过滤加载的员工填充该属性。

更新

正如我在上面的评论中所指出的,EF7不支持延迟加载。如果要避免Json.NET序列化该属性,可以在该属性上使用属性JsonIgnore,也可以创建自定义类(DTO)来投影查询并仅填充所需的属性。如果您决定使用最后一个解决方案,我还建议您查看Automapper