Эта проблема будет объяснена для трех классов: Учетная запись, Индивидуальная учетная запись и Доктор:
- Первые два класса являются абстрактными
- IndividualAccount является подклассом Account.
- Доктор является подклассом IndividualAccount.
Первый уровень наследования (между Account и IndividualAccount) реализуется с помощью методологии Table Per Type. Второй уровень наследования (между IndividualAccount и Doctor) внедряется с помощью методологии Table per Hierarchy.
Конфигурации Fluent API следующие:
class AccountConfiguration : EntityTypeConfiguration<Account>
public AccountConfiguration()
{
HasKey(x => x.Id);
...
}
}
class IndividualAccountConfiguration : EntityTypeConfiguration<IndividualAccount>
{
public IndividualAccountConfiguration()
{
ToTable("IndividualAccounts");
...
}
}
class DoctorConfiguration : EntityTypeConfiguration<Doctor>
{
public DoctorConfiguration()
{
...
}
}
Что мы ожидаем от этой конфигурации, так это иметь две таблицы: первая хранит идентификатор и общие свойства для всех пользователей (например, имя пользователя и пароль), а вторая хранит свойства, общие для всех людей (например, имя и номер телефона). Кроме того, во второй таблице будет поле дискриминатора, позволяющее различать врачей и других типов лиц, которые могут быть в нашем домене.
Проблема возникает, когда я пытаюсь получить Доктора по его идентификатору. Будет выдано исключение, утверждающее, что многие столбцы недействительны, самый важный из них:
Недопустимое имя столбца «Дискриминатор».\r\n
К моему удивлению, если я размещу [Table("IndividualAccounts")] над определением класса IndividualAccount, проблема будет решена. Но я уже установил имя таблицы в конфигурации (Fluent API). Почему я должен использовать аннотацию в дополнение к Fluent API?
Обновление
При наличии аннотации свойства доктора помещаются в таблицу IndividualAccounts, чего мы и ожидали. Но если я удалю аннотацию, будет создана новая миграция, пытающаяся переместить эти поля в базовую таблицу Account!