【问题标题】:Automatic Lazyloading on Entity Framework 4.0Entity Framework 4.0 中的自动延迟加载
【发布时间】:2010-05-25 20:33:19
【问题描述】:

假设我有一个以 OrderDetails 作为子属性的实体订单。

我像这样启用延迟加载:

  _context.ContextOptions.LazyLoadingEnabled = true;

我可以用这样的方法提供视图:

Order.GetAll()

并自动按订单详细信息导航,而不会出现wirerd“对象引用未设置为对象实例”错误??

【问题讨论】:

  • 我认为您可能需要提供更多代码。该错误可能指的是您的实体以外的许多不同事物。是的,启用延迟加载将允许您通过导航属性访问您的 OrderDetails 实体,而无需从数据源显式加载它。

标签: asp.net-mvc entity-framework lazy-loading poco


【解决方案1】:

如果你有延迟加载,当你加载对象时,你需要明确地包含子对象。

所以 Order.GetAll() 将包括

return context.Orders.Include("OrderDetails");

另一种选择是稍后加载订单详细信息,如下所示:

if (!order.OrderDetailsHeaders.IsLoaded)
{
    order.OrderDetailsHeaders.Load();
}

【讨论】:

  • 我认为如果延迟加载设置为 false,则上述适用,而不是 true...正确吗?
  • @Scott,不,我不这么认为。延迟加载意味着加载实体时不加载子元素。您必须使用 .Include 或 .Load 显式加载子实体。
  • @Mac,你是正确的 LazyLoadingEnabled=true;加载实体时不会加载子实体......但它会在您第一次尝试使用导航属性访问它时自动加载任何实体,而无需您自己显式加载它。或者,您可以使用 .Include 立即加载子项,或设置 LazyLoadingEnabled=false;并在需要访问实体之前调用 .Load。见此链接:msdn.microsoft.com/en-us/library/…
  • 对不起那些乱七八糟的家伙.....我只是忘了把我的业务对象作为虚拟属性。谢谢大家。
  • @Mac,根据以下 MSDN 链接,第二句指出:“启用延迟加载后,通过导航属性访问相关对象时会加载它们。” msdn.microsoft.com/en-us/library/dd456846.aspx
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多