Как включить дочерний объект дочернего объекта в 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");
дочерний класс содержит ссылку на класс 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 вы можете использовать:
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(); }