实体框架确定什么是Include()'ed

时间:2011-12-02 23:15:27

标签: entity-framework entity-framework-4

动态添加包含到实体查询,即

ObjectQuery<Address> oQuery = oAddressingEntitiesContext.Addresses.Include("StreetName");

if (sResultOption == "FULL")
{
    oQuery = oQuery.Include("AddressLocation").Include("AddressIdentifiers");
}

IQueryable<Address> oResult = oQuery.Where(oParser.getSearchPredicate());

如果实体具有包含的AddressLocation&amp;;是否有办法确定何时查看下游的查询结果?通过查看Address实体,AddressIdentifiers相关实体?

理想情况下,“IsLoaded”会有所帮助

foreach (Address oAddress in oResult)
{
    if (oAddress.AddressLocation.IsLoaded)
    {
       ...
    }
}

由于延迟加载,似乎对子相关实体的任何引用都会导致ef尝试加载它们。 (当访问相关实体时,我收到一个错误,当时没有包含已经有一个开放的数据加载器..)

1 个答案:

答案 0 :(得分:1)

IsLoadedRelatedEnd类中可用的属性,它是EntityReferenceEntityCollection<...>的基础。基于EntityObject的实体使用这些类来公开有关导航属性的信息,但POCO不会。在代理实体的情况下,您通常可以将集合导航属性转换为EntityCollection<...>(您仍然必须在该操作之前关闭延迟加载)但我不确定如何轻松地EntityReference除了深入挖掘ObjectStateEntryRelationshipManager

无论如何,当你检查房产时,你最大的问题可能就是例外。这可以通过两个选项来解决:您allow lazy loading to be performed或关闭它:

context.ContextOptions.LazyLoadingEnabled = false;

您可以在检查之前调用此方法,并且不会执行延迟加载。检查后,您可以再次启用延迟加载。