我正在使用一个为一定数量的项目实现 TPH 的遗留系统。所以当前的结构看起来像这样
Abstract Class 1 Abstract Class 2 Abstract Class 3
| | |
--------- --------- ---------
| | | | | | | | |
T1 T2 T3 T4 T5 T6 T7 T8 T9
因此,类型 (T*) 是所有表的鉴别器,但由于某些类型共享公共列,因此存在大量不同的表。问题是所有这些项目实际上都有一个小的共同点,但是没有办法将所有这些项目收集到一个集合中。实际上,层次结构实际上应该看起来更像这样。
--------------- Base Abstract 1 ----------
| | |
Abstract Class 1 Abstract Class 2 Abstract Class 3
| | |
--------- --------- ---------
| | | | | | | | |
T1 T2 T3 T4 T5 T6 T7 T8 T9
所以本质上我们拥有的是一个 TPT,其中每个类型的每个表都是一个 TPH。对于一个真实世界的例子,这就是我们需要的。
--------------- Vehicle ---------------
| | |
Car Boat Plane
| | |
--------- --------- ---------
| | | | | | | | |
BMW Toyota Fiat T4 T5 T6 T7 T8 T9
显然,最初的设计存在一些设计缺陷,没有人预计需要在不查询 3 个不同的表的情况下获取所有车辆的列表。所以我的问题是,现有的结构有没有办法将这个新的层次结构添加到实体框架中。我在想这样的事情
Vehicle
-------
VehicleId
TypeId (Boat, Plane, Car, etc)
ItemFK (BoatID, PlaneId, CarId)
这可能吗?有没有办法在实体框架中映射这些?我似乎无法正确匹配它们。如果我们用 VehicleId 替换 BoatId、PlaneId 和 CarId (如实体框架中的条件映射 - 或使用 TPH 的操作) ,似乎它可能会起作用,但那时我们将进行真正侵入性的模式更改,这并不是真正的选项,我不确定这是否可行。本质上,我需要一种将现有键映射到新层次结构的方法。任何帮助是极大的赞赏。我很茫然,似乎找不到任何可以回答我问题的解决方案。