【问题标题】:Joining NHibernate Classes that share a common column but no foreign key加入共享一个公共列但没有外键的 NHibernate 类
【发布时间】:2009-04-15 16:11:31
【问题描述】:

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

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

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

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

基本上我想要做的是将 Product 表连接到 AssetId 上的 Disposal 表,以便我的 Product 具有由资产连接的 Disposal 集合。我已经定义了以下映射,但 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>

【问题讨论】:

    标签: c# nhibernate nhibernate-mapping


    【解决方案1】:

    您是否已将您的处置映射到产品?

    您的架构并非唯一地将处置与产品相关联。处置只能与资产相关,而不能与产品相关。

    您的架构对我说,资产有很多产品,而资产有很多处置。没有任何内容表明处置是针对特定产品的。

    【讨论】:

      【解决方案2】:

      干净的方式:

        <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,我认为是schema导出生成的外键约束的名称。

      你可以试试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>
      

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 1970-01-01
        • 2014-10-16
        • 2019-10-29
        • 2012-10-15
        • 1970-01-01
        • 2020-05-12
        • 2022-01-20
        • 2021-11-12
        相关资源
        最近更新 更多