2017-02-23 32 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

Чтобы решить эту проблему, я изменил свойство Children на HierarchyEntry как обычную старую коллекцию (а не свойство навигации EF). Я использовал интерфейс коллекции только для чтения, чтобы избежать потенциальных ошибок с тем, кто не понимает, что это не трек-сборник EF.

Поскольку мой случай использования всегда включает загрузку всей иерархии, я добавил метод в иерархию, который будет управлять созданием этих дочерних коллекций по всей иерархии.

Это работает достаточно хорошо для моих целей, но оно определенно чувствует себя неуклюжим. Я бы приветствовал любые другие подходы.

 Смежные вопросы

  • Нет связанных вопросов^_^