EF code-first: Как загрузить связанные данные (родитель-ребенок-внук)?

ef-code-first entity-framework entity-framework-4.1 entity-framework-5 entity-framework-6

Вопрос

У меня есть это лицо:

public class DynamicPage {

    public int PageId { get; set; }

    public int Order { get; set; }

    public string MenuText { get; set; }

    public string MenuHover { get; set; }

    public int? ParentId { get; set; }

    public virtual DynamicPage Parent { get; set; }

    public virtual ICollection<DynamicPage> Children { get; set; }
}

У этого лица может быть 3 уровня: Родитель -> Ребенок -> Внуч. Как загрузить родительский (уровень 1) из всех связанных дочерних элементов (уровень 2) и для каждого дочернего элемента, связанного с внуком (уровень 3), если таковой имеется? Благодаря помощи.

Принятый ответ

EF 4.1 и синтаксис:

var entity = context.Parents
    .Include(p => p.Children.Select(c => c.GrandChildren))
    .FirstOrDefault(p => p.Id == 1); // or whatever condition

Популярные ответы

Если вы хотите облегчить жизнь себе, следуйте первым правилам EF Code, назвав ваши идентификаторы таблиц просто Id (или, альтернативно, имя таблицы + Id , например, DyanmicPageId ).

Это должно оставить вам что-то вроде этого:

public class DynamicPage
{
    public int Id { get; set; }
    public int Order { get; set; }
    public string MenuText { get; set; }
    public string MenuHover { get; set; }
    public int? ParentId { get; set; }

    public virtual DynamicPage Parent { get; set; }
    public virtual ICollection<DynamicPage> Children { get; set; }
}

Затем вам необходимо установить связь между родителями и детьми явно в методе OnModelCreating в вашем классе DbContext .

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<DynamicPage>()
        .HasMany(page => page.Children)
        .WithRequired(child => child.Parent)
        .HasForeignKey(child => child.ParentId);
}

Затем вы можете выбрать детей или внуков по мере необходимости:

var parent = dbContext.DynamicPages.Where(page => page.ParentId == null);
var children = parent.Children;
var grandchildren = parent.SelectMany(page => page.Children);
var allRelatedPages = parent.Union(children).Union(grandchildren);



Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему