Как включить дочерний объект дочернего объекта в Entity Framework 5

Я использую Entity Framework 5 code first а также ASP.NET MVC 3,

Я изо всех сил пытаюсь получить дочерний объект дочернего объекта для заполнения. Ниже мои уроки..

Класс приложения;

public class Application
{
     // Partial list of properties

     public virtual ICollection<Child> Children { get; set; }
}

Детский класс:

public class Child
{
     // Partial list of properties

     public int ChildRelationshipTypeId { get; set; }

     public virtual ChildRelationshipType ChildRelationshipType { get; set; }
}

Класс ChildRelationshipType:

public class ChildRelationshipType
{
     public int Id { get; set; }

     public string Name { get; set; }
}

Часть метода GetAll в хранилище для возврата всех приложений:

return DatabaseContext.Applications
     .Include("Children");

Класс Child содержит ссылку на класс ChildRelationshipType. Для работы с детьми приложения у меня было бы что-то вроде этого:

foreach (Child child in application.Children)
{
     string childName = child.ChildRelationshipType.Name;
}

Я получаю ошибку здесь, что контекст объекта уже закрыт.

Как мне указать, что каждый дочерний объект должен включать ChildRelationshipType объект как то, что я сделал выше?

4 ответа

Решение

Если вы включите библиотеку System.Data.Entity Вы можете использовать перегрузку Include() метод, который принимает лямбда-выражение вместо строки. Вы можете тогда Select() над детьми с выражениями Linq, а не string пути.

return DatabaseContext.Applications
     .Include(a => a.Children.Select(c => c.ChildRelationshipType));

С EF Core в.NET Core вы можете использовать ключевое слово ThenInclude:

return DatabaseContext.Applications
 .Include(a => a.Children).ThenInclude(c => c.ChildRelationshipType);

Включить ребенка из детской коллекции:

return DatabaseContext.Applications
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType1);
 .Include(a => a.Childrens).ThenInclude(cs => cs.ChildRelationshipType2);

Я закончил тем, что сделал следующее, и это работает:

return DatabaseContext.Applications
     .Include("Children.ChildRelationshipType");

Хороший пример использования шаблона универсального репозитория и реализации универсального решения для этого может выглядеть примерно так.

public IList<TEntity> Get<TParamater>(IList<Expression<Func<TEntity, TParamater>>> includeProperties)

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}
Другие вопросы по тегам