如何在多个实体到另一个实体之间创建 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 关系映射(即继承映射)的主要内容,如果未能解决你的问题,请参考以下文章

如何创建从一个实体到另一个现有实体的核心数据关系?

如何临时转到另一个视图来创建实体

通过多个列在两个实体之间创建多对多关系

如何设置核心数据实体之间的关系?

如何在多个子实体和列表属性之间建立关系?

如何将 ASP.NET Core 身份链接到另一个实体?