2

Из моего Web API службы с использованием шаблона generic-repository/uow с EF6, мне нужно вернуть вложенные свойства навигации. Модель A имеет модель B, а модель B - модель C и т. Д. Что-то вроде этого:Может включать в себя свойства навигации для вложения в веб-API с помощью EF6?

public class A 
    { 
     public int SomeID { get; set; } 
     public ICollection<B> Bs { get; set; } 
    }  
public class B 
    { 
     public int SomeID { get; set; } 
     public ICollection<C> Cs { get; set; } 
    } 

Я могу получить Bs в A, но Cs in B - null. Вот как я это делаю:

// GENERIC REPOSITORY 
public IQueryable<TEntity> Get(params Expression<Func<TEntity, object>>[] includes) 
     { 
      IQueryable<TEntity> query = _dbSet; 
      if (includes != null) 
      { 
       foreach (var include in includes) 
        query = query.Include(include); 
      } 
      return query; 
     } 
// FROM THE "A" CONTROLLER 
public HttpResponseMessage Get() 
     { 
      HttpResponseMessage response; 
      var results = _unitOfWork.A_Repository.Get(s => s.Bs); 
      if (results == null) 
      { 
       response = new HttpResponseMessage(HttpStatusCode.NotFound); 
      } 
      else 
      { 
       response = Request.CreateResponse(HttpStatusCode.OK, results); 
      } 
      return response; 
     } 

Я не понимаю, как я могу передать дополнительные лямбды от A контроллера, чтобы получить Cs в B загружен. Я вижу, как это сделать, не используя общий репозиторий. Я открыт для использования OData тоже, но не могу понять, как сделать это с помощью этого шаблона в Web API

Я также попытался использовать подход DbContext и не удалось:

public class MyContext : DbContext 
    { 
     public DbSet<A> As { get; set; } 
     public DbSet<B> Bs { get; set; } 
     public DbSet<C> Cs { get; set; } 

     public MyContext() 
      : base("MyDBContext") 
     { 
     }  
     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<B>().HasRequired(i => i.C); 
      Bs.Include(i => i.C); 
     } 
    } 

ответ

5

Вы делаете это с помощью одиночный Include call.

_context.A_Repository // where to get from 
    .Include(a => a.Bs.Select(b => b.Cs.Ds.Es)) // what to include 
    .Where(a => a.IsCool == true) // how to filter 
    .ToList(); // materialize result 

See remarks of EntityFramework documentation.

+0

Это работает. В моем примере он должен быть закодирован из единицы работы (_unitOfWork), а не контекста. Благодарю. –

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

  • Нет связанных вопросов^_^