gpt4 book ai didi

entity-framework-4 - Entity Framework 调用ToList()时会自动加载FK对象?

转载 作者:行者123 更新时间:2023-12-01 11:02:59 24 4
gpt4 key购买 nike

我对延迟加载的工作原理有点困惑。

例如,如果我有供应商对象,它的属性是 Address 外部对象,如下所示:

public class Supplier
{
public int ID { get; set; }
[Required]
public string FullName { get; set; }
public string TaxNumber { get; set; }
public virtual Address DeliveryAddress { get; set; }
}

当我在以下位置设置断点时:

var suppliers = dbContext.Supplier.ToList();

我可以看到 Address 信息可用于 var 供应商等。当我扩展 DeliveryAddress 属性时,它是可用的,这是否意味着所有 FK 对象都已加载?但另一方面,对于右侧的查询,我可以在断点处从 Visual Studio 中查看它,它是这样的:

{SELECT 
[Extent1].[ID] AS [ID],
[Extent1].[FullName] AS [FullName],
[Extent1].[TaxNumber] AS [TaxNumber],
[Extent1].[DeliveryAddress_ID] AS [DeliveryAddress_ID]
FROM [dbo].[Suppliers] AS [Extent1]}

这意味着查询本身根本不会加载 Address 对象?

那么谁在加载 FK 对象? ToList() 还是 VS 调试器?

关于如何确认是否是懒加载的其他建议?

注意:所以现在我通过两次 ToList 调用确认延迟加载正在工作,一个设置延迟加载关闭,另一个设置延迟加载打开。有人能告诉我一种方法来了解什么时候延迟加载另一个查询是为 FK 属性发送的吗?

最佳答案

VS 调试器加载相关对象,它发生在第二个 SQL 查询中,而不是您在问题中显示的那个。当您在调试器中钻取地址对象时,调试器会访问该对象的属性以显示它们的值。访问此对象会触发延迟加载和第二个 SQL 查询。

编辑

这是有效的,因为父对象不是您的 Supplier 类型,而是派生自 Supplier 的类(“代理”)。这个派生类是在运行时动态创建的,并且有一些神秘的自动生成的名称(你应该在调试器中看到这个类名)。此动态类与您的基础 Supplier 具有相同的属性,但它重载了 DeliveryAddress 属性。 (这就是为什么这些导航属性必须是 virtual 的原因,否则将无法重载。)该查询使用 FK 列值,该值已经通过您的供应商查询获取并通过此检索地址值(value)。

当您或调试器使用 supplier.DeliveryAddress 访问属性时调用的重载 DeliveryAddress 属性的新 getter 包含在运行时生成的运行 SQL 查询的代码从数据库加载相关对象。派生的代理类拥有各种额外的内部成员,尤其是对上下文/数据库连接的引用(以便能够运行查询)和一个标志,该标志指示代理对象它已经加载了导航属性,因此当您第二次访问 DeliveryAddress 时,它不会运行第二个冗余查询。

简而言之,这就是 POCO 延迟加载的工作方式。

关于entity-framework-4 - Entity Framework 调用ToList()时会自动加载FK对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8932680/

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