EF6 Table-per-Hierarchy (TPH) - абстрактный базовый класс с абстрактным свойством не генерирует миграцию

У меня есть абстрактный базовый класс для TPH:

public abstract class BaseSchema
{
    ...
    public abstract bool IsFilterRequired { get; set; }
    ...
}

.. и я наследую от него в других производных классах согласно:

public class DerivedSchema : BaseSchema
{
    .....
    public override bool IsFilterRequired{ get; set; }
    ....
}

Эта установка отлично работает для других унаследованных свойств в этих классах (те, которые я пропустил), и это работает на сегодняшний день.

Проблема заключается в добавлении свойства IsFilterRequired, которое я показал выше, - я добавляю это абстрактное свойство в базовый класс и переопределяю его в производном классе. Я ожидал бы, что EF подберет это и сгенерирует миграцию, чтобы добавить новый столбец в таблицу SQL Server, но он просто создаст пустую миграцию.... Что может быть не так с этим? Спасибо!

1 ответ

Решение

Спасибо @ivan-stoev за руководство. В основном, абстрактные свойства игнорируются EF. Если вы хотите указать свойство вашего базового класса, которое будет наследоваться производными классами, вы захотите, чтобы EF создал столбец базы данных, чтобы представить это. Пометка свойства как "виртуального" позволяет EF создать столбец:

public abstract class BaseSchema
{
    ...
    public virtual bool IsFilterRequired { get; set; }
    ...
}

Кроме того, если у вас есть несколько производных классов, унаследованных от общей базы TPH, это свойство теперь будет доступно для всех них. Если это поведение, которое вам не нужно, вам нужно переопределить его в производных классах, к которым он не принадлежит, и пометить его как не реализованное. Не идеально, но лучше, чем альтернатива, и это очень легко поймает ошибку времени выполнения, которая будет обнаружена в модульном тестировании.

public class DerivedSchemaThatDoesNotNeedThisProperty : BaseSchema
{
...
    public override bool IsFilterRequired
    {
        get { return false; }
        set { throw new NotImplementedException($"{nameof(IsFilterRequired)} property is not implemented in this class."); }
    }
... 
}
Другие вопросы по тегам