代码之家  ›  专栏  ›  技术社区  ›  gerrod

实体框架引用未自动加载

  •  7
  • gerrod  · 技术社区  · 16 年前

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

    奇怪的是,当我 手动 要求引用加载,它们加载得很漂亮。

    举个例子:

    if (account.HoldingEntity == null && 
        account.HoldingEntityReference.EntityKey != null) {
    
        account.HoldingEntityReference.Load();
        account.HoldingEntity = account.HoldingEntityReference.Value;
    }
    

    当我第一次检查 HoldingEntity 它总是空的,但是负载会毫无问题地返回holdingentity。

    有什么线索吗?

    谢谢!

    3 回复  |  直到 16 年前
        1
  •  7
  •   Paulo Santos    16 年前

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

    Dim entity = (From e in db.Entities.Include("SubEntity"))
    
        2
  •  5
  •   Alex James    16 年前

    正如其他人所说,你需要 .Include() 在v1中避免需要呼叫 .Load()

    在4.0中,您将能够设置 DeferredLoadingEnable 在你身上 ObjectContext (我想我们把这个名字改得更合适些 LazyLoadingEnabled 及时进行beta2)。

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

    当两个相关实体在同一个上下文中时,它们会自动固定关系以指向彼此。因此,如果(正如我怀疑的那样)4个实体中的2个已经在您的上下文中,那么在执行查询时,您将最终处于加载2个关系的情况下,即使您没有调用 包含() 加载() .

    希望这有帮助

    干杯 亚历克斯

        3
  •  0
  •   marc_s    16 年前

    这是作为一个设计决策在EFV1中完成的,并且许多开发人员实际上更喜欢对是否以及何时将加载引用的属性进行显式控制。

    对于在2009年底之前推出.NET 4.0的EFV4,如果您愿意,您可以选择启用自动延迟加载。见 this blog post 有关EFv4中延迟加载的详细信息,请访问ADO.NET团队日志。

    马克