我可以使用现有的可为空列作为实体框架中的鉴别器吗?

问题描述 投票:0回答:1

我一直在文档中寻找明确的答案,但找不到。

我的用例是我有一个使用“非官方”每个层次结构表(TPH)的现有表。它使用具有不同值的列,稍后根据模型中的空值和非空值进行映射。

作为重构的一部分,我们希望在 EF 中正确映射它,但不幸的是我们没有很大的自由度,因为此列也在遗留系统映射中使用。

我的主要问题是通过如下配置,我收到运行时“数据为空错误”。

       tableBase
            .HasDiscriminator<string>(nameof(tableBase.ExistinColumn))
            .HasValue<Child1>(null)
            .HasValue<Child2>("string1")
            .HasValue<Child2>("string2")
            .HasValue<Child2>("string3");

正如您所看到的,该列有 4 个值,null 应与 Child1 类映射,其余所有值应与 Child2 类映射。

不确定是否是这样,我配置错误。

创建一个新列并使用迁移脚本根据现有列值填充它并最终将其用作鉴别器是实现此目的的唯一方法吗?

这当然是最好的方法,但我不确定它会在遗留系统中导致什么样的问题。

提前致谢,

c# .net entity-framework discriminator
1个回答
0
投票

正如评论中也提到的,我尝试了一个新专栏的解决方案。 当然处于 POC 状态,但似乎运行良好。

步骤。

  1. 创建了一个 Discriminator int 计算列,该列从标量函数中获取值,该函数通过包装案例返回判别器值。
  • 0 当列值为空时
  • 1 当字符串 1
  • 2 当字符串 2
  • 3 当字符串 3
  • -1,当它们都没有时。
  1. 在 TableBase 类中创建了一个 NotMapped int Discriminator 属性。
  1. 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);
    
© www.soinside.com 2019 - 2024. All rights reserved.