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

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();
}