2016-06-16 82 views
0

我正试图在ProjectVersions列表上进行基本的热切加载,其中每个ProjectVersion都有一个FieldValues和ChildProjects列表。当我加载ProjectVersions时,我想要将FieldValues和ChildProjects与其所有属性一起加载,但似乎在通过每个ProjectVersion时,它仍然会触击数据库以获取这些集合(检查sql server分析器)。任何指针都会有帮助。为什么不急切加载在实体框架中工作

var publishedList = Repository.Find<Project>().//a bunch of wheres and selects 

      IEnumerable<ProjectVersion> publishedList = published 
       .Include(x => x.FieldValues) 
       .Include(x => x.ChildProjects) 
       .ToList(); 

    //EDIT: the context is hidden behind a generic Repository. Below are some details: 

     public class Repository : IRepository 
      { 
       internal readonly IDataContext _context; 

       public Repository(IDataContext context) 
       { 
        _context = context; 
        _context.Committed += _context_Committed; 
        _context.Deleted += _context_Deleted; 
       } 
       public IQueryable<T> Find<T>() where T : class, IEntity 
       { 
        return _context.Repository<T>(); 
       } 
     } 

     public class EfDataContext : IDataContext 
      { 
       public IQueryable<T> Repository<T>() where T : class, IEntity 
       { 
        var table = _context.Set(typeof(T)); 
        WrappedFieldsObjectQuery<T>(table.Cast<T>().AsExpandable())); 
        return table.Cast<T>().AsExpandable(); 
       } 
     } 

    public class MsmDbContext : DbContext 
    { 
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); 

      var typesToRegister = Assembly.GetExecutingAssembly().GetTypes() 
       .Where(type => 
        type.IsClass && 
        type.BaseType.IsGenericType && 
        type.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)); 

      foreach (var config in typesToRegister.Select(Activator.CreateInstance)) 
      { 
       modelBuilder.Configurations.Add((dynamic)config); 
      } 

      base.OnModelCreating(modelBuilder); 
     } 
    } 

    public class ProjectMapping : EntityTypeConfiguration<Project> 
    { 
     public ProjectMapping() 
     { 
      HasOptional(p => p.LastChangedBy).WithMany(p => p.ProjectsChanged).WillCascadeOnDelete(); 
      HasRequired(p => p.CreatedBy).WithMany(p => p.ProjectsCreated).WillCascadeOnDelete(); 
      HasRequired(d => d.Account).WithMany(p => p.Projects).WillCascadeOnDelete(); 
      HasRequired(d => d.PinType).WithMany(p => p.Projects).HasForeignKey(p => p.PinType_Id).WillCascadeOnDelete(); 
     } 
    } 

    public static class RepositoryFactory 
     { 
      public static IRepository CreateRepository() 
      { 
       return CreateEfRepository(); 
      } 

      internal static IRepository CreateEfRepository() 
      { 
       return new Repository(new EfDataContext(new MsmDbContext())); 
      } 
     } 
+0

你能发表更详细的查询吗?特别是涉及的DbContext会有帮助。 –

+0

@FlorianHaider是的,DbContext隐藏在非常通用的Repository模式后面,我会尝试查看是否可以发布相关代码。 – Riz

回答

0

好吧,我看不到你的完整的查询,但在你的意见,你写了一些关于select。一旦您使用Select()进行自定义预测,EF将忽略Include()声明,我的猜测是这就是为什么预加载无法正常工作。取而代之的Include(),尽量要加载的属性添加到您的投影,像

Repository.Find<Project>() 
.Select(p => new { project = p, p.FieldValues, p.ChildProjects }) 
.AsEnumerable().Select(p => p.project).ToList() 

这样的投射会照顾加载数据的,你不需要Include()

0

实际上,我通过直接使用DataContext得到了它的工作。不知怎的,知识库正在搞砸了。

相关问题