EF6 Table-per-Hierarchy (TPH) - 抽象基础 class 和抽象 属性 不生成迁移

EF6 Table-per-Hierarchy (TPH) - abstract base class with abstract property does not generate a migration

我为 TPH 设置了一个抽象基础 class:

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

.. 我在其他派生的 classes 中继承了它:

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

此设置适用于这些 classes 中的其他继承属性(我遗漏的属性),并且迄今为止一直有效。

问题是我在上面显示的 'IsFilterRequired' 属性 的添加 - 我将这个摘要 属性 添加到基础 class 并且在派生 class 中覆盖它。我希望 EF 会选择它并生成一个迁移以将新列添加到 SQL 服务器 table,但它只是创建一个空迁移.... 这可能有什么问题? 谢谢!

感谢@ivan-stoev 的指导。基本上,EF 会忽略抽象属性。如果您希望指定基 class 上的 属性 由派生 class 继承,您需要 EF 创建一个数据库列来表示它。将 属性 标记为 'virtual' 允许 EF 创建列:

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

顺便说一句,如果您有多个派生的 classes 从共同的 TPH 基础继承,这个 属性 现在将对所有这些人可用。如果这是您不想要的行为,您需要在它不属于的派生 classes 中覆盖它,并将其标记为未实现。不理想,但比替代方案更好,它会抛出一个非常容易捕获的运行时错误,该错误会在单元测试中被捕获。

public class DerivedSchemaThatDoesNotNeedThisProperty : BaseSchema
{
...
    public override bool IsFilterRequired
    {
        get { return false; }
        set { throw new NotImplementedException($"{nameof(IsFilterRequired)} property is not implemented in this class."); }
    }
... 
}