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

У меня есть абстрактный базовый класс, настроенный для 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 Ответ

0 голосов
/ 23 ноября 2018

Спасибо @ 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."); }
    }
... 
}
...