Nhibernate,集合和compositeid

时间:2009-04-19 20:33:12

标签: nhibernate collections composite

我有下表:

Bucket(
 bucketId smallint (PK)
 name varchar(50)
)

BucketUser(
 UserId varchar(10) (PK) 
 bucketId smallint (PK)
)

复合键不是问题,我知道如何解决这个问题,但是我希望我的存储桶类能够连接到BucketUser的IList。我阅读了在线参考文献,并认为我已经破解了它但没有。这两个映射在

之下

- 斗 -

<class name="Bucket,Impact.Dice.Core" table="Bucket">
  <id name="BucketId" column="BucketId" type="Int16" unsaved-value="0">
    <generator class="native"/>
  </id>

  <property column="BucketName" type="String" name="BucketName"/>

  <bag name="Users" table="BucketUser" inverse="true" generic="true" lazy="true">
    <key>
      <column name="BucketId" sql-type="smallint"/>
      <column name="UserId" sql-type="varchar"/>
    </key>
    <one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>
  </bag>
</class>

- bucketUser -

<class name="BucketUser,Impact.Dice.Core" table="BucketUser">
  <composite-id>
    <key-many-to-one name="BucketUser" class="Bucket,Impact.Dice.Core" column="BucketId"/>
    <key-property name="UserId" column="UserId" type="string"></key-property>
  </composite-id>
</class>

2 个答案:

答案 0 :(得分:7)

密钥是包含实体的外键,而不是主键。

您有两种选择:

  • 该类代表一个独立的实体,拥有自己的ID。它可以从其他类引用,始终在同一个表中,可以独立加载。
  • 或者它是另一个没有独立身份的实体的一部分。如果被其他类引用,它总是在一个单独的表中。它不能(轻松地)独立于其父实体加载。

Bucketuser是一个独立的实体。它有自己的映射定义,您可以使用一对多引用它。你得到一个复合键,但我会避免这种情况。

<!-- reference to BucketUser. There is not table attribute needed. -->
<bag name="Users" inverse="true" generic="true" lazy="true">
  <key>
    <!-- foreign key -->
    <column name="BucketId" sql-type="smallint" />
  </key>
  <one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>
</bag>

<!-- BucketUser mapped as an independent entity -->
<class name="BucketUser" ... >
  <!-- here is the composite id, try to avoid this -->
  <composite-id>
    <key-property name="BucketId">
    <key-property name="UserId">
  </composite-id>
</bag>

Bucketuser是Bucket的依赖部分。 Bucket的外键同时是主键:

<!-- The table is defined on the fly by the table attribute -->
<bag name="Users" table="BucketUser" inverse="true" generic="true" lazy="true">
  <key>
    <column name="BucketId" sql-type="smallint" />
  </key>
  <!-- use composite-element to define the contents of the table -->
  <composite-element>
    <!-- define the contents of the BucketUser here -->
    <property name="UserId" sql-type="varchar"/>
  </composite-element>
</bag>

取决于您的情况,哪种策略是合适的。

答案 1 :(得分:0)

你得到什么错误?如果您真的剪切并粘贴了该映射,那么解决方案可能就像替换

中的逗号一样简单
<one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>

有一段时间。