【问题标题】:Entity Framework references not loading automatically实体框架引用未自动加载
【发布时间】:2009-06-23 11:08:44
【问题描述】:

在 ADO.Net Entity Framework 中,我有一个对象,它有 4 个对其他对象的引用。出于某种原因,当我查询这些引用时,其中两个会自动加载(如预期的那样),其中两个总是返回 null。

奇怪的是,当我手动要求加载引用时,它们加载的只是花花公子。

举个例子:

if (account.HoldingEntity == null && 
    account.HoldingEntityReference.EntityKey != null) {

    account.HoldingEntityReference.Load();
    account.HoldingEntity = account.HoldingEntityReference.Value;
}

当我第一次检查 HoldingEntity 时,它始终为 null,但是 Load 将毫无问题地返回 HoldingEntity。

有什么线索吗?

谢谢!

【问题讨论】:

    标签: c# entity-framework ado.net


    【解决方案1】:

    使用 ADO.NET Entities,您需要使用Include 指定要自动加载的实体,如

    Dim entity = (From e in db.Entities.Include("SubEntity"))
    

    【讨论】:

    • 完美,解决了,谢谢!我想我仍然不明白的是,为什么其中两个引用会自动加载,而其中两个没有?
    • 这并不完全正确(至少从 EF 4 开始,我从未使用过 EF 1)。您可以指定要自动(并立即)加载的引用,但您也可以根据需要依赖延迟加载来加载。但是,即使在 EF 4 中,延迟加载似乎也被破坏了,因此从实际角度来看,这可能仍然是正确的答案。见msdn.microsoft.com/en-us/library/bb896272.aspx
    【解决方案2】:

    正如其他人所说,您需要在 v1 中使用 .Include() 以避免需要调用 .Load()

    在 4.0 中,您将能够在您的 ObjectContext 上设置 DeferredLoadingEnabled(我认为我们会及时将此名称更改为更合适的 LazyLoadingEnabled 以用于 Beta2)。

    至于为什么你已经加载了 2 个关系。这可能是所谓的关系修复的副作用。

    当两个相关实体在同一个上下文中时,它们会自动将它们的关系固定为指向彼此。因此,如果(我怀疑)4 个实体中的 2 个已经在您的上下文中,那么当您执行查询时,即使您没有调用 .Include().Load().

    希望对你有帮助

    干杯 亚历克斯

    【讨论】:

    • 啊!谢谢你,很有意义。
    • 关系是如何自动修复的,有没有办法禁用它?这对我造成了一些严重的副作用,因为它正在回填物体。谢谢!
    【解决方案3】:

    这是在 EF v1 中作为设计决策完成的,许多开发人员实际上更喜欢明确控制是否以及何时加载引用的属性。

    对于 2009 年底之前与 .NET 4.0 一起推出的 EF v4,如果您愿意,您可以选择打开自动延迟加载。有关 EF v4 中延迟加载的更多信息,请参阅 ADO.NET 团队博客上的 this blog post

    马克

    【讨论】:

    • 没错,Marc,但是延迟加载的问题是数据库上有很多查询,应该明智地使用。根据需要,预加载实体很简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多