【问题标题】:How should I map relationships between multiple inheritance models?我应该如何映射多个继承模型之间的关系?
【发布时间】:2012-05-03 12:09:10
【问题描述】:

我有一个具有 Table Per Hierarchy(品牌)和 Table Per Type(车辆)继承的实体框架模型,如下所示:

(Vehicle 和 Brand 是抽象类)。

到目前为止一切顺利,我可以使用 Vehicle.OfType<>Brand.OfType<> 方法访问 linq 查询中的派生实体。

现在,Brand 实体在我的概念模型上与 Vehicle 是一对多相关的,所以问题是,我应该如何在 EF 模型上建立关系,以便我可以继续使用 Vehicle 和 Brand 之间的导航属性,但同时保持Brand? 上 TPH 继承的一致性,我的第一种方法是仅关联派生类,例如:

但如果我这样做,我无法直接从 Vehicle 访问 Brand,所以我必须做一个双重关系(在派生和基础之间),例如:

现在这对我有用,但不知何故我仍然有重复的关系,对吗?,你有更好的方法吗?,我在建模上犯了一些愚蠢的错误吗?

【问题讨论】:

  • 魔鬼代言人提问:本田是个什么样的品牌?恕我直言,您在这里过度使用继承。
  • 我知道有些品牌同时拥有(汽车和摩托车),但在这种情况下,我们希望将它们区分为“Honda Car”和“Honda Bykes”,这就是为什么你认为是过度的使用?
  • 因为一个对象只能有一种类型。即使您认为这对本田来说是正确的,但也并非对所有品牌都适用。使用类型作为单个业务属性的标志,这样会使您陷入难以发展架构的角落。我会将其建模为关联:[Brand: Honda] 与 [CarBrand: HondaCars] 相关(即 2 个实例而不是层次结构)。然后,如果您想拥有一个可以同时包含两者的品牌,您可以将基数从 1:1 更改为 1:*。

标签: entity-framework inheritance relation


【解决方案1】:

在我看来,您在模型中遇到交叉链接的原因是您人为地将 BrandVehicle 分离为顶级兄弟实体。如果你从 Brand 开始,它似乎本质上等同于 Make,那将成为真正的顶级实体。无需为每种车辆类型(汽车、摩托车、卡车等)分别Make;只需在 MakeVehicle 之间引入实体 Model,我认为这可以解决您的大部分交叉链接问题。

那么关系不是严格意义上的父子关系,而是更准确的组合。所以你有 Make,它与 Model 具有一对多的复合关系,而后者又与 Vehicle。车辆是 Model实例,因此那里也没有真正的父子关系。有了这种结构,就不需要为每种类型的 Vehicle 分支 EF,因为这只是 Model 实体所描述内容的一部分。

我希望我的回答对您有所帮助,并且我没有遗漏您尝试建模的任何要点-

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多