2016-06-16 4 views
0

Я пытаюсь выполнить базовую загрузку в списке ProjectVersions, где каждый ProjectVersion имеет список FieldValues ​​и ChildProjects. Я хочу, чтобы FieldValues ​​и ChildProjects загружались вместе со всеми их свойствами при загрузке ProjectVersions, но, похоже, что в моем коде при прохождении через каждую ProjectVersion он по-прежнему попадает в базу данных для получения этих коллекций (проверка профилировщика SQL-сервера). Любые указатели были бы полезны.Почему не работает загрузка в Entity Framework

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 скрыт за очень общим шаблоном репозитория, я постараюсь посмотреть, могу ли я разместить соответствующий код. – Riz

ответ

0

Хорошо, я не могу видеть ваш полный запрос, но в комментариях вы написали что-то о select. EF будет игнорировать операторы Include(), как только вы делаете пользовательские прогнозы, используя Select(), я думаю, что поэтому загрузка с нетерпением не работает. Вместо Include(), попробуйте добавить свойства, которые вы хотите загрузить на вашу проекцию, что-то вроде

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

Таким образом, проекция будет заботиться о загрузке данных, вам не нужно Include().

0

На самом деле, я получил его для работы, просто работая с DataContext. Как-то репозиторий прикручивает его.

Смежные вопросы