c# – 实体框架与TPH的多级继承

前端之家收集整理的这篇文章主要介绍了c# – 实体框架与TPH的多级继承前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用一个遗留系统,为一定数量的项目实现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
        ///
    }

猜你在找的C#相关文章