Как включить дочерний объект дочернего объекта в 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, как то, что я сделал выше?

Ответ 1

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

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

Ответ 2

С 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);

Ответ 3

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

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

Ответ 4

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

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

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}