【问题标题】:How to create NHibernate relationship mapping between multiple entities to another entity (i.e inheritance mapping)如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)
【发布时间】: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。

标签: nhibernate inheritance orm nhibernate-mapping


【解决方案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{ 
                                     get{return null;}
    }
    

    CarOwnership 类中,OwnedObject 实现将是

    public override Object OwnedObject{ 
                                     get{return this.Car;}
    }
    

    希望这会有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-07
      • 2011-07-25
      • 2015-08-02
      • 1970-01-01
      • 2016-09-23
      • 1970-01-01
      • 2015-06-20
      • 2022-12-11
      相关资源
      最近更新 更多