实体框架与TPH的多级继承

use*_*736 10 c# entity-framework table-per-type table-per-hierarchy

我正在使用遗留系统,为一定数量的项目实现TPH.所以目前的结构看起来像这样

 Abstract Class 1     Abstract Class 2     Abstract Class 3
         |                    |                    |
     ---------            ---------            ---------
    |    |    |          |    |    |          |    |    |
    T1   T2   T3        T4    T5   T6         T7   T8   T9
Run Code Online (Sandbox Code Playgroud)

因此Type(T*)是跨所有表的鉴别器,但由于某些类型共享公共列,因此存在大量不同的表.问题是所有这些项目实际上都有一个共同点,但没有办法将所有这些项目收集到一个集合中.实际上,层次结构实际上看起来应该更像这样.

          --------------- Base Abstract 1 ---------- 
         |                    |                    |
 Abstract Class 1     Abstract Class 2     Abstract Class 3
         |                    |                    |
     ---------            ---------            ---------
    |    |    |          |    |    |          |    |    |
    T1   T2   T3        T4    T5   T6         T7   T8   T9
Run Code Online (Sandbox Code Playgroud)

基本上我们所拥有的是TPT,其中每种类型的每个表都是TPH.对于一个真实世界的例子,这是我们需要的.

          ---------------  Vehicle   --------------- 
         |                    |                    |
        Car                 Boat                 Plane
         |                    |                    |
     ---------            ---------            ---------
    |    |    |          |    |    |          |    |    |
   BMW Toyota Fiat      T4   T5   T6         T7    T8   T9
Run Code Online (Sandbox Code Playgroud)

显然,初始设计存在一些设计缺陷,没有人预计需要在不查询3个不同表格的情况下获取所有车辆的列表.所以我的问题是,现有的结构有一种方法可以将这种新的层次结构添加到实体框架中.我在想这样的事情

  Vehicle
  -------
  VehicleId
  TypeId (Boat, Plane, Car, etc)
  ItemFK (BoatID, PlaneId, CarId)
Run Code Online (Sandbox Code Playgroud)

这可能吗?有没有办法在实体框架中映射这些?我似乎无法正确匹配它们.如果我们用VehicleId替换BoatId,PlaneId和CarId似乎可能有用(比如实体框架中的条件映射 - 或者使用TPH进行操作)但是在那时我们将进行真正的侵入式模式更改,这实际上不是选项,我不确定它是否会奏效.基本上我需要一种方法将现有密钥映射到新的层次结构.任何帮助是极大的赞赏.我很茫然,似乎无法找到解决我问题的任何解决方案.

jjj*_*jjj 0

问题是所有这些项目实际上都有一个小的共同点,但没有办法将所有这些项目收集到一个集合中。

也许您可以让每个层次结构中的类型实现一个公共接口?由于每个层次结构已经是一个单独的表,因此通过添加公共基类似乎不会获得太多好处,而且似乎不值得这么麻烦。