EF代碼優先:如何加載相關數據(父子孫子)?

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

熱門答案

如果你想使生活容易對自己,跟隨你的命名表ID的EF代碼優先約定簡單地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; }
}

然後,您需要在DbContext類的OnModelCreating方法中顯式設置父項和子項之間的關係。

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

然後,您可以根據需要選擇子女或孫子女:

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



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因