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