即使没有请求,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包。
答案 0 :(得分:3)
这是EF的正常行为。执行查询时,您加载的所有实体都将附加到您的上下文。因此,EF不会执行另一个查询并部分加载Department.Employees
,这些员工在执行查询时会更早加载。总而言之,当您咨询Department.Employees
导航属性时,EF将使用您Gender
的查询过滤加载的员工填充该属性。
正如我在上面的评论中所指出的,EF7不支持延迟加载。如果要避免Json.NET序列化该属性,可以在该属性上使用属性JsonIgnore
,也可以创建自定义类(DTO)来投影查询并仅填充所需的属性。如果您决定使用最后一个解决方案,我还建议您查看Automapper。