2017-02-23 60 views
0

EF中帶有扭曲的自我引用層次結構。有一個實體代表層次本身。該實體與層次結構中的條目有一對多的關係。EF - 高效加載自引用層次結構,其中每個層次結構元素引用單個實體

這裏的(有些省略掉)類:

[Table("Hierarchies")] 
public class Hierarchy 
{ 
    public Hierarchy() 
    { 
     Entries = new List<HierarchyEntry>(); 
    } 

    public int Id { get; set; } 
    public string Name { get; set; } 

    public virtual ICollection<HierarchyEntry> Entries { get; set; } 
} 

[Table("HierarchyEntries")] 
public class HierarchyEntry 
{ 
    public HierarchyEntry() 
    { 
     Children = new List<HierarchyEntry>(); 
    } 

    public int Id { get; set; } 

    [ForeignKey("Hierarchy")] 
    public int HierarchyId { get; set; } 

    [ForeignKey("Parent")] 
    public int? ParentId { get; set; } 
    public string Name { get; set; } 

    public CostCenterHierarchy Hierarchy { get; set; } 
    public CostCenterHierarchyEntry Parent { get; set; } 
    public virtual ICollection<HierarchyEntry> Children { get; set; } 
} 

從一個數據庫一點上,我能明顯得到了層次結構成員使用單個查詢。然而,當我下降等級時,我可以看到EF經常爲該級別的孩子查詢數據庫。

這種情況對於EF來說是不尋常的用例,所以我不介意爲了讓層次結構快樂而做一些工作,但是我似乎無法在每次與兒童工作時都避免查詢。

有沒有辦法指導EF關於這種情況,所以我可以停止錘擊我的數據庫?

回答

0

爲了解決這個問題,我將HierarchyEntry上的Children屬性更改爲普通舊集合(不是EF導航屬性)。我使用了一個只讀集合接口,以避免有人沒有意識到這不是一個EF追蹤集合的潛在錯誤。

由於我的用例總是涉及到加載整個層次結構,我在層次結構中添加了一個方法來管理整個層次結構中這些子集合的創建。

這對我的目的來說已經夠用了,但它絕對讓人覺得笨重。我會歡迎任何其他方法。