EF code-first: как загрузить связанные данные (parent-child-внучка)? - PullRequest
7 голосов
/ 22 сентября 2011

У меня есть этот объект:

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), если есть? Спасибо за помощь.

Ответы [ 2 ]

10 голосов
/ 22 сентября 2011

EF 4.1 функция и синтаксис:

var entity = context.Parents
    .Include(p => p.Children.Select(c => c.GrandChildren))
    .FirstOrDefault(p => p.Id == 1); // or whatever condition
0 голосов
/ 22 сентября 2011

Если вы хотите упростить себе жизнь, следуйте правилам EF Code First, называя идентификаторы вашей таблицы просто 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);
...