1

我为 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 表中,但它只会创建一个空迁移......这可能有什么问题?谢谢!

4

1 回答 1

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."); }
    }
... 
}
于 2018-11-23T11:16:16.643 回答