Як включити дочірній об’єкт дочірнього об'єкта в Entity Framework 5


138

Я використовую 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об’єкт, як те, що я робив вище?


Відповіді:


256

Якщо ви включаєте бібліотеку, System.Data.Entityви можете використовувати перевантаження Include()методу, який приймає лямбда-вираз замість рядка. Потім ви можете Select()над дітьми використовувати вирази Linq, а не stringшляхи.

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

6
Як сказав GraemeMiller, сильно набрані класи краще для ремонту, ніж використання рядків
Ryan Amies

У якій версії став доступний метод ламба? Я застряг на кодовій базі EF 4.0. І не можу примусити ламди працювати. Дякуємо за будь-який вклад.
granadaCoder

5
Він буде працювати в EF 4, просто обов’язково додайте посилання наSystem.Data.Entity;
Ryan Amies

5
FYI - У EF 6 простір іменMicrosoft.Data.Entity
Брэд

Використовуючи EF 5, я не зміг дістати. StateProvince) .Include (b => b.BillingAddress) .Include (bs => bs.BillingAddress.StateProvince) .FirstOrDefault (x => x.UserId == userId);
Geovani Martinez

91

За допомогою 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);

6
Дякую!!! Дуже корисно! Іноді ви можете отримати неправильну інтелігенцію, просто ігноруйте це і будуйте! :)
muhihsan

Гарний, я шукав .net core :)
Енді Кларк

1
А що, якщо діти - це колекція, і мені потрібно включити в неї властивості?
додбрій

Для цього виявлено перевантаження. Спочатку не було очевидно.
додбрій

1
@dodbrian Яке було перевантаження? Я намагаюся вкласти гніздо. Потім включіть, де дитина - колекція.
Грег Хардін

22

Я закінчив робити наступне, і це працює:

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

76
Сильно набраний спосіб краще. Чарівні струни не корисні для рефакторингу
GraemeMiller

2

Хороший приклад використання схеми загального сховища та реалізації загального рішення для цього може виглядати приблизно так.

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

{

    foreach (var include in includeProperties)
     {

        query = query.Include(include);
     }

        return query.ToList();
}

Як я назвав би описаний вище метод? ви можете навести приклад
Jamee

@Jamee -List <Вираз <Func <PersonObject, об'єкт >>> includeers = новий Список <Вираз <Func <PersonObject, об'єкт >>> (); Aders (x => x.FirstName); Отримайте <PersonObject> (включає в себе);
gcoleman0828

1
І запит походить від ...?
Дуг Борода

Вибачте @DougBeard, що не відповів на ваше запитання.
gcoleman0828

1
@ gcoleman0828 Змінна запиту у вашому фрагменті коду вище. Це магічно примірник? Звідки воно походить?
Дуг Борода
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.