Eager用Entity Framework加载所有属性

时间:2015-09-16 20:15:32

标签: entity-framework eager-loading

所以LazyLoadingEnabled = false显然没有做我认为的事情。并且几乎没有文档。

我非常仔细地设计我的实体树。我认真对待每一段关系。当我加载一个聚合根的实体时,我想要从那里导航的所有来加载。这就是聚合根概念的工作原理,如果我希望每周都有相关内容,我会在实体上粘贴一个id并自己管理这种关系。

有没有办法用Entity Framework做到这一点?

2 个答案:

答案 0 :(得分:2)

您可以尝试获取元素类型的所有NavigationProperties(在IQueryable中)。通过访问MetadataWorkspace ObjectContext,您可以获得特定类型的属性并轻松包含所有内容。

请注意,我认为您使用的是EF5或更高版本,而使用的是DbContext。我们通过接口IObjectContextAdapter访问ObjectContext。这是代码:

public static IQueryable<T> LoadAllRelatedObjects<T>(this IQueryable<T> source, DbContext context) {
        //obtain the EntityType corresponding to the ElementType first
        //then we can get all NavigationProperties of the ElementType
        var items = (ObjectItemCollection) ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace.GetItemCollection(DataSpace.OSpace);            
        var entityType = items.OfType<EntityType>().Single(e => items.GetClrType(e) == source.ElementType);
        return entityType.NavigationProperties
                         .Aggregate(source, (c, e) => c.Include(e.Name));
}

请注意,在新版本中(自EF5起),ObjectItemCollection(以及其他元数据项)的命名空间为System.Data.Entity.Core.Metadata.Edm,而旧版本(EF5之前)的命名空间为System.Data.Metadata.Emd

<强>用法

yourModel.YourEntities.LoadAllRelatedObjects(yourModel)
         //. more query here ...
         ;

答案 1 :(得分:1)

我认为没有办法让所有导航属性自动加载。如何改为使用扩展方法?

public static IQueryable<Company> LoadCompany(this IQueryable<Company> query) {
     return query.Include(x => x.Divisions)
                 .Include(x => x.Departments)
                 .Include(x => x.Employees);
}

示例:

var query = from company in db.Companies.LoadCompany()
            where company.Name == "Microsoft"
            select company;