Как включить дочерний объект дочернего объекта в 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();
}