Предотвратить циклический parent_ID `таблица на тип` против` таблицы на иерархию` против `таблицы на класс`

Я использую TPH Table Per Hierarchy в Entity Framework, который в основном является частичным классом для общих основных атрибутов для расширенных типов данных.

У меня 2 объекта / класса; Course Object и Student Object, которые имеют те же базовые свойства, что и MyBaseCommonEntity. Цель состоит в том, чтобы иметь возможность выполнить Service/ticket на любом из объектов. Мне нужна помощь в моделировании этого, будет ли это общий тип или тип наследования?

Мои вопросы: я использую int для ссылки на parentID. Ключ pK таблицы также имеет тип int.

  1. Как предотвратить циклические ссылки
  2. Выполняется ли эта проверка при настройке
  3. Предоставляет ли тип Иерархии эту функциональность по умолчанию?
  4. В чем разница между таблицей по типу, таблицей по иерархии и таблицей по классам?

    public partial class MyBaseCommonEntity
    {
        public int Id { get; set; }
        //Does it have any parents, does it belong to anyone
        public int? ParentId { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }
    
        public System.DateTime CreatedDate { get; set; }
        public System.DateTime StartDate { get; set; }
        public System.DateTime? EndDate { get; set; }
    
        // Audit Stuff, whom, when why?
        public System.DateTime? AuditDate { get; set; }
        public string AuditUser { get; set; }
        public string AuditComments { get; set; }
    }
    

person everest    schedule 01.11.2015    source источник


Ответы (1)


Я думаю, вы смешиваете здесь две вещи - поддержку иерархии (id / parentid) и наследование классов (повторное использование одного базового класса). Первые три пункта касаются иерархии; четвертый - о наследовании.

  1. Насколько мне известно, циклическая проверка ссылок в стиле, который вы имеете в виду, напрямую не поддерживается в EF. Вы можете сделать это самостоятельно (в случае SQL-сервера, например, создав ограничение CHECK с CTE)

  2. Поскольку циклические проверки в этой форме не поддерживаются EF, поэтому он вообще не проверяется.

  3. HierarchyID не поддерживается EF напрямую. Вы можете проверить какую-нибудь стороннюю библиотеку, которая добавляет поддержку иерархии. .

  4. На самом деле здесь речь идет не о родительском / дочернем, а о том, как представить наследование классов в базе данных. Все упомянутые вами параметры описаны в соответствующей статье базы знаний здесь: Реализация наследования с помощью Entity Framework

В общем, не стоит делать так, чтобы ученик и курс унаследовали от чего-то одного; они в основном не связаны. Вы можете просто сделать еще одну запись, например «AuditInfo», и добавить ссылку на нее в классе «Студент» и «Курс». Может иметь больше смысла.

person Nikolay    schedule 02.11.2015