我正在使用一个遗留系统,为一定数量的项目实现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(如Conditional Mapping in Entity Framework – OR operation with TPH)替换BoatId,PlaneId和CarId,似乎可能会起作用,但是在这一点上,我们将做一个非常有创意的模式更改,这不是一个真正的选择,我不知道甚至工作.本质上,我需要一种将现有密钥映射到新层次结构中的方法.任何帮助是极大的赞赏.我很失落,似乎找不到任何解决问题的解决方案.
解决方法
你可以使用这个结构
public class Vehicle { [Key] public int Id { set; get; } /// // common properties /// public Car Car { set; get; } public Boat Boat { set; get; } public Plane Plane { set; get; } } public class Car { [Key,ForeignKey("Vehicle")] public int VehicleId { set; get; } public Vehicle Vehicle { set; get; } /// // Car properties /// } public class Boat { [Key,ForeignKey("Vehicle")] public int VehicleId { set; get; } public Vehicle Vehicle { set; get; } /// // Boat properties /// } public class Plane { [Key,ForeignKey("Vehicle")] public int VehicleId { set; get; } public Vehicle Vehicle { set; get; } /// // Plane properties /// }