c# - 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 表中,但它只会创建一个空迁移......这可能有什么问题?谢谢!
解决方案
感谢@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."); }
}
...
}
推荐阅读
- excel - Filter() 就地不重复公式
- python - Conv Net 模型中的误差拟合模型:值误差
- python - 如何从另一个类/屏幕中的 TextInput 更改文本?
- python - Python 中的 get() 和 .get 有什么区别?
- javascript - 将对象分组到具有不同标签的数组中
- php - 尝试使用 Laravel Sql 查询获取每种类型的 1 个元素
- python - python f-string如何将{}字符用于变量并作为字符串
- maven - maven-release-plugin 先前版本的文档在哪里?我正在寻找版本 2.8.2
- django - 如何在 Django 中为 Laravel 多态相关数据建立 ContentType 关系?
- vba - 如何使用 VBA Selenium 单击复选框跨度类