Nhibernate, коллекции и композитные - PullRequest
0 голосов
/ 20 апреля 2009

У меня есть таблицы ниже:

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

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

Сложный ключ - не проблема, это нормально, я знаю, как обойти это, но я хочу, чтобы мой класс корзины содержал IList BucketUser. Я прочитал онлайн-ссылку и подумал, что взломал ее, но не сделал. Два отображения ниже

- ведро -

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

7 голосов
/ 20 апреля 2009

Ключ - это внешний ключ к содержащему объекту, а не первичный ключ.

У вас есть два варианта:

  • класс представляет собой независимую сущность, имеющую собственный идентификатор. На него можно ссылаться из других классов, он всегда находится в той же таблице и может быть загружен независимо.
  • или это часть другого лица, не имеющего самостоятельной идентичности. Если на него ссылаются другие классы, он всегда находится в отдельной таблице. Он не может (легко) загружаться независимо от родительского объекта.

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>

В зависимости от вашего случая, какая стратегия подходит.

0 голосов
/ 20 апреля 2009

Какую ошибку вы получаете? Если вы действительно вырезали и вставили это отображение, решение может быть таким же простым, как замена запятой в

<one-to-many class="Bucket,Impact.Dice.Core" not-found="ignore"/>

с точкой.

...