gpt4 book ai didi

c# - 使用 EF6 语法在 EF Core 中急切加载相关实体

转载 作者:太空狗 更新时间:2023-10-30 01:30:38 26 4
gpt4 key购买 nike

在 EF6 中,我们曾经像这样加载相关实体:

query                                                   // (A)
.Include(q => q.Employee.Supervisor.Office.Address)
.Include(q => q.Orders);

这会急切加载该链中的所有实体。

在 EF Core 中,您应该这样做:

query                                                   // (B)
.Include(q => q.Employee)
.ThenInclude(q => q.Supervisor)
.ThenInclude(q => q.Office)
.ThenInclude(q => q.Address)
.Include(q => q.Orders);

这非常(非常!)不太友好,但有效。

我们的代码库有大量的 (A) 调用,我们必须将其升级到 (B) 以便我们可以使用 EF Core。

我发现在许多情况下,EF Core 与 (A) 一起工作得很好,即使它不应该! ...有时它会完全失败。

这是侥幸吗?它是否应该在某些情况下与 (A) 一起使用?因为除非迫不得已,否则我不想进行数百次更改,然后再进行测试。

最佳答案

实际上,只要包含路径包含简单的引用类型(即非集合类型)导航属性,这两种语法都适用于 EF Core。这是因为 Include 的“流畅”版本在 EF6 和 EF Core 中,正在对描述导航属性路径的类型安全方式进行建模,例如 Root -> Employee -> Supervisor -> Office -> Address ,其中不安全版本表示为 string (也受 EF6 和 EF Core 支持)"Employee.Supervisor.Office.Address" . EF Core 示例似乎更喜欢始终使用 Include/ThenInclude模式,因为它更通用并且适用于引用和集合类型属性,我们将在后面看到。

真正的区别在于描述集合类型导航属性的相关属性时。假设 Order您示例中的类具有导航属性 ICollction<OrderDetail> OrderDetailsOrderDetail类包含 Vendor Vendor属性(property)。 string包含根+订单+订单详细信息+订单详细信息供应商的导航路径是"Orders.OrderDetails.Vendor" , 但它不能简单地表示为 Include(q => q.Orders.OrderDetails.Vendor)表达式(编译错误)。此处 EF6 和 EF Core 采用不同的方法。 EF6 正在使用标准 LINQ Select 解决它运算符(operator):

.Include(q => q.Orders.Select(o => o.OrderDetails.Select(d => d.Vendor)))

和 EF Core - 使用 ThenInclude自定义扩展方法:

.Include(q => q.Orders).ThenInclude(o => o.OrderDetails).ThenInclude(d => d.Vendor)

我不能说哪个更好 - 两者各有利弊。 EF6 产生嵌套,但允许外部代码提供 include 表达式(形式为 Expression<Func<T, object>> )而不引用 EF 相关程序集。另一方面,EF Core 语法是“扁平”的,如果它们是集合或引用,则允许轻松链接附加属性而无需携带,但没有简单的方法在外部提供包含。

但要点是——无论好坏,包含集合元素相关属性的语法是不同的,在将 EF6 代码移植到 EF Core 时必须考虑这一点。实际上,在某些初始 EF Core 版本中,支持旧语法(除了新语法之外),但由于某些未知原因,它已被删除。唯一的好处是你不需要修改所有你的Include s - 只需使用 Select 找到那些在里面并将它们转换为 ThenInclude语法。

关于c# - 使用 EF6 语法在 EF Core 中急切加载相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44084375/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com