【发布时间】:2012-01-19 20:17:33
【问题描述】:
我对延迟加载的工作原理有点困惑。
例如,如果我有供应商对象,它具有地址外部对象作为属性,如下所示:
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();
我可以看到,地址信息对 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 属性发送另一个查询的延迟加载?
【问题讨论】:
-
你如何确定 DeliveryAddress 已经被急切/非延迟加载?您确定只有 1 个查询发送到数据库吗?您可以启动 SQL Profiler 以准确查看发送到数据库的查询。
-
嗨,我如何启动 SQL Profiler?我使用的是 SQL Server 2008 R2,似乎没有可用的 SQL Profiler 菜单。我只能看到:导入和导出、Server Management Studio、配置工具、集成服务?
标签: entity-framework-4 lazy-loading poco