Entity framework 使用实体框架加载所有属性

Entity framework 使用实体框架加载所有属性,entity-framework,eager-loading,Entity Framework,Eager Loading,所以LazyLoadingEnabled=false显然没有像我想象的那样。而且几乎没有任何文件 我非常仔细地设计实体树。我认真考虑每一段感情。当我加载一个作为聚合根的实体时,我希望从那里加载所有可导航到的内容。这就是聚合根概念的工作原理,毕竟,如果我想让某些东西每周都相关,我会在实体上粘贴一个id,并自己管理关系 有没有办法用Entity Framework实现这一点?我认为没有办法自动加载所有导航属性。换成一个扩展方法怎么样 public static IQueryable<Compa

所以
LazyLoadingEnabled=false
显然没有像我想象的那样。而且几乎没有任何文件

我非常仔细地设计实体树。我认真考虑每一段感情。当我加载一个作为聚合根的实体时,我希望从那里加载所有可导航到的内容。这就是聚合根概念的工作原理,毕竟,如果我想让某些东西每周都相关,我会在实体上粘贴一个id,并自己管理关系


有没有办法用Entity Framework实现这一点?

我认为没有办法自动加载所有导航属性。换成一个扩展方法怎么样

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

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

请注意,我假设您使用的是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));
}

谢谢我可能会写一些带有反射的东西…我真不敢相信这不是内置的。
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));
}
yourModel.YourEntities.LoadAllRelatedObjects(yourModel)
         //. more query here ...
         ;