如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)
Posted
技术标签:
【中文标题】如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)【英文标题】:How to create NHibernate relationship mapping between multiple entities to another entity (i.e inheritance mapping) 【发布时间】:2013-04-03 04:46:32 【问题描述】:我在 Car、Bike、Skateboard 对象与 Person 对象之间存在这种关系。 关系存储在 Ownership 表中。
如何在 NHibernate 中创建此映射?我正在尝试遵循本教程:http://nhibernate.info/doc/nh/en/index.html#inheritance。任何帮助表示赞赏。
【问题讨论】:
稍后会发布.hbm.xml。似乎我应该使用继承映射,但哪种映射类型最好:每个具体类的表?或者使用隐式多态性(见上面的链接)? 我必须承认这个模型对我来说有点奇怪。我会插入一个车辆类作为汽车/自行车/某人的超类。此类将是持有类型代码逻辑的类。然后你可以依赖“每个层次结构的表”策略 其实 Car/Bike/Skateboard 只是一个简单的示例。在我们真实的应用程序中,真实的对象有很大的不同。例如:即使每个类的 Id 属性也不同 - 有些使用 Int64,有些使用 GUID...为了提问,我将它们简化为 Car/Bike/Skateboard。 【参考方案1】:这是我可以做的方式。
<class lazy="false" name="Domain.OwnerShip, Domain" table="OwnerShip_Table">
<id name="Id" column="OwnerShipId" type="System.Int32" access="property">
<generator class="identity"></generator>
</id>
<joined-subclass name="Car" table="Cars" lazy="false">
<key column="Id" />
<property name="Owner" />
</joined-subclass>
<joined-subclass name="Bike" table="Bikes" lazy="false">
<key column="Id" />
<property name="Owner" />
</joined-subclass>
<joined-subclass name="Skateboard" table="Skateboards" lazy="false">
<key column="Id" />
<property name="Owner" />
</joined-subclass>
</class>
您可能需要一个 Persons 表以及一个 Person 实体,其中包含一个映射,其中 Person 有一个 Bag of OwnedVehicles。
【讨论】:
【参考方案2】:这是一个选项,每个层次结构都有一个表。 我假设:
所有权拥有自己的 ID(OwnerShipId
,自动生成)
每个引用的类/表 (BikeId, CarId
) 都有一个列,用于处理不同的键类型和外键
然后映射看起来像:
<class lazy="false" name="Domain.OwnerShip, Domain" table="OwnerShip_Table" discriminator-value="0">
<id name="Id" column="OwnerShipId" type="System.Int32" access="property">
<generator class="identity"></generator>
</id>
<discriminator column="VehicleTypeCode" type="int"/>
<many-to-one name="Owner" column="PersonId" not-null="true" fetch="..."/>
<many-to-one name="CodeType" column="VehicleTypeCode" not-null="true" fetch="..." />
<subclass name="Domain.BikeOwnerShip, Domain" discriminator-value="1">
<many-to-one name="Bike" column="BikeId" not-null="true" fetch="..."/>
</subclass>
<subclass name="Domain.CarOwnerShip, Domain" discriminator-value="2">
<many-to-one name="Car" column="CarId" not-null="true" fetch="..."/>
</subclass>
</class>
我想在基类中有一个虚拟的、未映射的OwnedObject
属性也会很好,比如
public virtual Object OwnedObject
getreturn null;
在CarOwnership
类中,OwnedObject 实现将是
public override Object OwnedObject
getreturn this.Car;
希望这会有所帮助
【讨论】:
以上是关于如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)的主要内容,如果未能解决你的问题,请参考以下文章