2009-04-19 5 views
0

Je les tableaux ci-dessous:Nhibernate, collections et compositeid

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

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

La clé composite est pas le problème des thats ok je sais comment contourner cela, mais je veux que ma classe seau pour contanin un IList de BucketUser. J'ai lu la référence en ligne et j'ai pensé que je l'avais craqué mais je n'ai pas eu. Les deux applications sont ci-dessous

- Godet -

<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

J'ai réécrit ma réponse pour la rendre plus claire. Le mapping de votre bucketuser n'est pas visible, vous devez le faire "code". –

Répondre

0

Quelle erreur obtenez-vous? Si vous avez vraiment coupé et-collé que le mappage alors la solution peut être aussi simple que le remplacement de la virgule dans

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

avec une période.

+0

Salut merci pour la réponse. La clé principale est "" Clé étrangère (FK32947277369BF2: Bucket [BucketId, UserId])) doit avoir le même nombre de colonnes que la clé primaire référencée (Bucket [BucketId]) "} Donc, le bucketid est la clé primaire de la table bucket et sa partie de la clé de l'avant sur la table seauUser –

7

La clé est la clé étrangère de l'entité contenant, pas la clé primaire.

Vous avez deux options:

  • la classe représente une entité indépendante, ayant un ID propre. Il pourrait être référencé à partir d'autres classes, est toujours dans la même table et pourrait être chargé indépendamment.
  • ou fait partie d'une autre entité sans identité indépendante. S'il est référencé par d'autres classes, il est toujours dans une table distincte. Il n'a pas pu (facilement) être chargé indépendamment de son entité parente.

Bucketuser est une entité indépendante. Il a sa propre définition de mappage et vous la référencez en utilisant un-à-plusieurs. Vous obtenez une clé composite dans votre cas, mais je l'éviterais.

<!-- 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 est une partie dépendante du godet. La clé étrangère au godet est la clé primaire en même temps:

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

Cela dépend de votre cas quelle stratégie est appropriée.

+0

Je trouve quand j'ai inverse = vrai, les éléments composites ne sont pas réellement sauvés – JoshBerke

+0

@JoshBerke: Peut-être. Inverse signifie pour NH: ne pas le stocker, son déjà stocké à partir d'un autre chemin. –