我一直在文档中寻找明确的答案,但找不到。
我的用例是我有一个使用“非官方”每个层次结构表(TPH)的现有表。它使用具有不同值的列,稍后根据模型中的空值和非空值进行映射。
作为重构的一部分,我们希望在 EF 中正确映射它,但不幸的是我们没有很大的自由度,因为此列也在遗留系统映射中使用。
我的主要问题是通过如下配置,我收到运行时“数据为空错误”。
tableBase
.HasDiscriminator<string>(nameof(tableBase.ExistinColumn))
.HasValue<Child1>(null)
.HasValue<Child2>("string1")
.HasValue<Child2>("string2")
.HasValue<Child2>("string3");
正如您所看到的,该列有 4 个值,null 应与 Child1 类映射,其余所有值应与 Child2 类映射。
不确定是否是这样,我配置错误。
创建一个新列并使用迁移脚本根据现有列值填充它并最终将其用作鉴别器是实现此目的的唯一方法吗?
这当然是最好的方法,但我不确定它会在遗留系统中导致什么样的问题。
提前致谢,
正如评论中也提到的,我尝试了一个新专栏的解决方案。 当然处于 POC 状态,但似乎运行良好。
步骤。
EF 映射修改为以下
tableBase
.HasDiscriminator<int>(nameof(tableBase.Discriminator))
.HasValue<Child1>((int)DeriveTypesEnum.Child1)
.HasValue<Child2>((int)DeriveTypesEnum.Child2)
.HasValue<Child3>((intDeriveTypesEnum.Child3)
.HasValue<Child4> ((int)DeriveTypesEnum.Child4);