加入共享公共列但没有外键的NHibernate类

时间:2008-11-20 22:24:16

标签: c# nhibernate nhibernate-mapping

我有几个表要映射到类。表格如下所示:

Asset
---------
AssetId
AssetName

Product
---------
ProductId
ProductName
AssetId

Disposal
---------
DisposalId
AssetId
DisposalDate

基本上我想要做的是将产品表加入AssetId上的Disposal表,以便我的产品具有按资产加入的Disposals集合。我定义了以下映射,但NHibernate(1.2)似乎忽略了包中定义的键列,并选择通过ProductId将Product表连接到Disposal表(即Product.ProductId = Disposal.AssetId)。我不确定这是不是一个错误,或者我没有正确定义它,但如果有人有办法做到这一点,我会非常感激。

  <class name="Product" table="Product" lazy="false">
    <id name="ProductId" column="ProductId" type="int">
      <generator class="native" />
    </id>
    <property name="ProductName" column="ProductName"/>
    <bag name="Disposals" fetch="join" >
      <key column="AssetId" foreign-key="AssetId/>
      <many-to-many class="Disposal"/>
    </bag>
  </class>

2 个答案:

答案 0 :(得分:1)

您的Disposals是否已映射到产品?

您的架构并不唯一与处置与产品相关。处置只能涉及资产,而不涉及产品。

您架构告诉我,资产有很多产品,资产有很多处置。没有任何迹象表明处置是针对特定产品的。

答案 1 :(得分:0)

干净的方式:

  <class name="Product" table="Product" lazy="false">
    <id name="ProductId" column="ProductId" type="int">
      <generator class="native" />
    </id>
    <property name="ProductName" column="ProductName"/>
    <many-to-one name name="Asset" class="Asset" column="AssetId" />
  </class>

  <class name="Asset">
    <id name="AssetId" >
      <generator class="native" />
    </id>
    <property name="AssetName" />
    <bag name="Disposals">
      <key column="AssetId" />
      <many-to-many class="Disposal" />
    </bag>
  </class>

foreign-key用于DDL,我认为它是模式导出生成的外键约束的名称。

您可以尝试使用property-ref,但不能完全确定它是否有效:

  <class name="Product" table="Product" lazy="false">
    <id name="ProductId" column="ProductId" type="int">
      <generator class="native" />
    </id>
    <property name="ProductName" column="ProductName"/>
    <property name="AssetId" />
    <bag name="Disposals" fetch="join" >
      <key column="AssetId" property-ref="AssetId/>
      <one-to-many class="Disposal"/>
    </bag>
  </class>