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."); }
}
...
}
我为 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."); }
}
...
}