如何在多个实体到另一个实体之间创建NHibernate关系映射(即继承映射)

如何在多个实体到另一个实体之间创建NHibernate关系映射(即继承映射),nhibernate,inheritance,orm,nhibernate-mapping,Nhibernate,Inheritance,Orm,Nhibernate Mapping,汽车、自行车、滑板对象和人对象之间存在这种关系。 关系存储在所有权表中 如何在NHibernate中创建此映射?我正在努力学习本教程:。非常感谢您的帮助。这里有一个选项,每个层次都有一个表。 我假设: 所有权拥有自己的Id(OwnerShipId,自动生成) 每个引用的类/表都有一列(BikeId,CarId),用于处理不同的键类型和外键 然后,映射将类似于: <class lazy="false" name="Domain.OwnerShip, Domain" table="Ow

汽车、自行车、滑板对象和人对象之间存在这种关系。 关系存储在所有权表中


如何在NHibernate中创建此映射?我正在努力学习本教程:。非常感谢您的帮助。

这里有一个选项,每个层次都有一个表。 我假设:

  • 所有权拥有自己的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>
CarOwnership
类中,OwnedObject实现将是

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

希望这会有所帮助这里有一个选项,每个层次都有一个表。 我假设:

  • 所有权拥有自己的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>
CarOwnership
类中,OwnedObject实现将是

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

希望这会有所帮助,以下是我可能的做法

<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>


您可能需要Person表以及带有映射的Person实体,其中Person有一包OwnedVehicles。

我可以这样做

<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>


您可能需要Person表以及带有映射的Person实体,其中Person有一包OwnedVehicles。

稍后将发布.hbm.xml。似乎我应该使用继承映射,但哪种映射类型最好:每个具体类的表?或者使用隐式多态性(见上面的链接)?我必须承认,这个模型对我来说有点奇怪。我将插入一个车辆类作为car/bike/sb的超类。这个类将是一个持有类型代码逻辑的类。然后你可以依赖“每个层次表”策略事实上,汽车/自行车/滑板只是一个简单的例子。在我们的真实应用程序中,真实的对象大不相同。例如:甚至每个类的Id属性都是不同的-一些使用Int64,一些使用GUID…为了提问,我将它们简化为Car/Bike/Skateboard。稍后将发布.hbm.xml。似乎我应该使用继承映射,但哪种映射类型最好:每个具体类的表?或者使用隐式多态性(见上面的链接)?我必须承认,这个模型对我来说有点奇怪。我将插入一个车辆类作为car/bike/sb的超类。这个类将是一个持有类型代码逻辑的类。然后你可以依赖“每个层次表”策略事实上,汽车/自行车/滑板只是一个简单的例子。在我们的真实应用程序中,真实的对象大不相同。例如:甚至每个类的Id属性都是不同的-一些使用Int64,一些使用GUID…为了提问,我将它们简化为汽车/自行车/滑板。