2012-03-12 79 views
3

我有一个表每一个分层(品牌)的Eentity框架模型,也是一个表每种类型(车辆)继承这样的:如何映射多个继承模型之间的关系?

enter image description here

(车辆和品牌是抽象类) 。

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

现在,Brand实体与我的概念模型中的Vehicle有很多关系,所以问题是,我应该如何在EF模型上建立关系,这样我才能继续使用Vehicle和Brand之间的导航属性,但同时保持对品牌的TPH继承的一致性?我的第一种方法是只涉及衍生clases,如:

enter image description here

但如果我这样做,我必须直接从汽车品牌没有进入,所以我会必须做一个双重关系(派生和基地之间),如:

enter image description here

这对我来说现在可行,但我仍然有一个重复的关系莫名其妙,是否有更好的方法?,我在我的建模上犯了一些愚蠢的错误?

+0

唱反调的问题是什么的基本点:什么样的品牌是本田?恕我直言,你在这里过度使用继承。 – 2012-03-13 12:03:57

+0

我知道有品牌同时拥有(汽车和摩托车),但在这种情况下,我们希望将它们区分为“本田汽车”和“本田拜克斯”,这就是为什么您认为是过度使用? – Milox 2012-03-13 15:46:51

+1

因为对象只能有一种类型。即使你认为这对本田来说也是合适的,但对任何地方的每个品牌来说都是不对的。使用类型作为单个业务属性的标志,可以将您带入难以发展架构的角落。我将这个模型作为一个关联进行建模:[品牌:Honda]与[CarBrand:HondaCars]相关(即2个实例,而不是层次结构)。那么你可以将基数从1:1更改为1:*,如果你想拥有一个可以包含两者的品牌。 – 2012-03-13 18:11:02

回答

1

在我看来,你正在运行到模型中的交联的原因是因为你被人为分离品牌车辆作为顶级兄弟实体。如果您从品牌开始,这看起来基本上等于使成为真正的顶级实体。对于每种车型(汽车,摩托车,卡车等),不需要分开制造;只需介绍实体模型之间使车辆和我认为,解决了大多数交联问题。

然后,这些关系不是严格的亲子关系,但作为构成更准确。所以你有制造,它与模型有一个一对多的复合关系,它与车辆有一个一对多的复合关系。车辆是实例模型,所以在那儿也没有真正的亲子关系。有了这种结构,就不需要为每种类型的Vehicle分支EF,因为这只是Model实体描述的部分。

我希望我的回答是有益的,我没有错过任何你想型号 -