EF6每层制表(TPH)-具有抽象属性的抽象基类不会生成迁移

时间:2018-11-22 17:06:21

标签: c# entity-framework-6 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 个答案:

答案 0 :(得分: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."); }
    }
... 
}