【问题标题】:Entity Framework 7 Include() not working as expectedEntity Framework 7 Include() 未按预期工作
【发布时间】:2016-03-21 22:38:50
【问题描述】:

即使没有请求,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)

我得到了Employee 对象的Department 属性——这与我为Department 有一个Include 一样预期。我发现Department.Employees 也被填满,但只是部分填满(仅限男性员工)。我没有为Department.Employees 指定Include,但它仍然被填充。这种行为是设计使然吗?有什么办法可以避免在这种情况下获取Department.Employees

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

【问题讨论】:

  • 您是否启用了延迟加载?如果是这样,Department.Employees 可能会在第二个查询中填充。您是否运行 SQL Profiler 来找出发送到数据库的确切查询?
  • 没有延迟加载发生。 SQL Profiler 仅显示为单个查询:SELECT [e].[EmployeeId], [e].[DepartmentId], [e].[Gender], [e].[Name], [d].[DepartmentId], [ d].[Name] FROM [Employee] AS [e] INNER JOIN [Department] AS [d] ON [e].[DepartmentId] = [d].[DepartmentId] WHERE [e].[Gender] = 'Male '
  • 仅供参考,EF7 不支持延迟加载,至少目前是这样

标签: entity-framework entity-framework-core


【解决方案1】:

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

更新:

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

【讨论】:

  • 当我枚举Department.Employees 时没有执行新的查询。我假设这是因为 EF7 尚未支持延迟加载。不管延迟加载支持如何,我仍然想避免填写Department.Employees。这是因为我正在序列化结果并且不希望 Department 中的二级不完整列表。使用 Json.Net 的 PreserveReferencesHandling 设置或设置序列化深度是我的一些选择。但是,避免创建我不需要的集合对象是最有效的。
  • 您已经急切地加载了两个表,EF 将使用所有条目填充上下文。然后,关系修复将填充有关上下文中其他项目的所有导航属性。如果您不希望填充反向导航属性,请使用两个上下文并自己填充两端的导航属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2016-01-18
  • 2021-06-04
  • 2022-01-24
  • 2015-05-11
相关资源
最近更新 更多