Entity Framework DB-First, реализовать наследование

Я пытаюсь реализовать наследование, используя сущность framework 6.0 и первый подход к базе данных. ОК, скажем, у меня есть объект Person и Organization, как показано ниже:

// a simplified version of organization entity
public class Organization
{
    public Guid ID { get; set; }
    public string Nickname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public string OfficialName { get; set; }
    public Guid CEOID { get; set; }
    public DateTime? RegisterDate { get; set; }
}

// a simplified version of person entity
public class Person
{
    public Guid ID { get; set; }
    public string Nickname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
    public Guid PersonID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleName { get; set; }
    public string NationalCode { get; set; }
    public DateTime? BirthDate { get; set; }
}

Я могу создать эти две таблицы в базе данных, но я хочу использовать наследование, поэтому поля, которые повторяются как в Person, так и в Organization, могут быть в другом базовом классе, как показано ниже:

public class Identity
{
    // These fields are the common fields between Person and Organization
    public Guid ID { get; set; }
    public string Nickname { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
}

Как я могу достичь этого в db-первом подходе?

Ответ 1

Один из возможных способов - использовать одну таблицу для каждого типа, называемого TPT (таблица за один тип), который я предпочитаю использовать, Для этого вы определяете свои таблицы, как модель, показанная на следующем рисунке:

table hierarchy

Обратите внимание, что отношения между дочерним и базовым объектами один к одному на своих столбцах pk, и все общие поля перемещаются в базовую таблицу. После создания таблиц щелкните правой кнопкой мыши на странице моделей в вашей визуальной студии и выберите Обновить модель из базы данных..., а затем на вкладке добавления выберите эти 3 таблицы для добавления. Сначала вы должны увидеть эту модельную диаграмму, которую нужно немного изменить:

tables added at first

Сделайте следующие шаги для Person и Organization отдельно:

  • Щелкните правой кнопкой мыши объект и выберите Свойства
  • В Базовом типе выберите Identity
  • Выберите, а затем удалите ассоциацию между этим объектом и Identity
  • Выберите, а затем удалить PK (столбец ID) этого объекта (наследует от основной сущности)

После этих шагов сохраните свою модель. Теперь ваша модель должна выглядеть так:

the changed model

Теперь скомпилируйте свой проект и наслаждайтесь жизнью!

P.S. Я понимаю, что кто-нибудь может отредактировать мой ответ и объяснить наследование TPH (таблица на иерархию) в инфраструктуре сущности.

Надеюсь, что это поможет.