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 (таблица на иерархию) в инфраструктуре сущности.
Надеюсь, что это поможет.