2009-04-19 2 views
0

У меня есть таблицы ниже:Nhibernate, коллекции и compositeid

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

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

Составной ключ не проблема Thats хорошо, я знаю, как обойти это, но я хочу, чтобы мой класс ведро contanin с 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> 
+0

Я переписал свой ответ, чтобы сделать его более ясным. Отображение вашего bucketuser не видно, вам нужно сделать его «кодом». –

ответ

0

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

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

с периодом.

+0

Привет, спасибо за ответ. Основной ключ - «« Внешний ключ (FK32947277369BF2: Bucket [BucketId, UserId])) должен иметь такое же количество столбцов, что и ссылочный первичный ключ (Bucket [BucketId]) »} Таким образом, в основном bucketid является первичным ключом в таблице ковша и его часть ключа foreigh на таблице bucketUser – 2009-04-20 10:20:15

7

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

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

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

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 является первичным ключом в то же время:

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

Я нахожу, когда у меня есть inverse = true, составные элементы фактически не сохраняются – JoshBerke

+0

@JoshBerke: Может быть. Обратные средства для NH: не храните его, его уже сохраненный с другого пути. –

Смежные вопросы