实体框架引用未自动加载

时间:2009-06-23 11:08:44

标签: c# entity-framework ado.net

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

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

举个例子:

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

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

当我第一次检查HoldingEntity时,它总是为空,但是Load会返回HoldEntity而没有问题。

任何线索?

谢谢!

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:5)

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

在4.0中,您可以在DeferredLoadingEnable上设置ObjectContext d(我认为我们正在将此名称更改为更恰当的LazyLoadingEnabled以及Beta2)。

至于为什么你已经加载了2个关系。这可能是一种叫做“关系修复”的副作用。

当两个相关实体在同一个Context中时,它们会自动将它们的关系固定为彼此指向。因此,如果(我怀疑)4个实体中有2个已经在您的上下文中,当您执行查询时,即使您没有调用{{1},最终也会遇到加载了2个关系的情况。 }或.Include()

希望这有帮助

干杯 亚历

答案 2 :(得分:0)

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

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

马克