0

Я использую таблицу для иерархии TPH в Entity Framework, которая в основном является частичным классом для общих основных атрибутов для расширенных типов данных.Запретить циклическую parent_ID `table per type` vs` table per hierarchy` vs `table per class`

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

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

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

    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; } 
    } 
    

ответ

0

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

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

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

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

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

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

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