2017-02-23 14 views
0

EF内に自己参照階層があります。階層自体を表すエンティティがあります。このエンティティは、階層自体のエントリと1対多の関係を持ちます。ここで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追跡されたコレクションではないことを認識していない人との潜在的なバグを避けるために、読み取り専用のコレクションインターフェイスを使用しました。

私の使用事例では常に階層全体が読み込まれるため、階層全体にこれらの子コレクションの作成を管理するメソッドを階層に追加しました。

これは私の目的には十分に機能しますが、間違いなく気難しいと感じます。私は他のアプローチを歓迎するだろう。

関連する問題