EF - 有效加载自引用层次结构,其中每个层次结构元素引用单个实体

时间:2017-02-23 03:08:08

标签: entity-framework-6

我在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这种情况,所以我可以停止锤击我的数据库?

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我将HierarchyEntry上的Children属性更改为普通旧集合(不是EF导航属性)。我使用了只读集合界面来避免潜在的错误,因为有人没有意识到这不是EF跟踪的集合。

由于我的用例总是涉及加载整个层次结构,因此我在层次结构中添加了一个方法来管理整个层次结构中这些子集合的创建。

这对我的目的来说足够好,但它确实感觉很笨重。我欢迎任何其他方法。