2009-01-08 8 views
0

Nous avons trois tables A, B, C.trois tableaux relatifs Persistance utilisant nhibernate

Colonnes

A => id, x

B => id, y

C => A.id, B.id

Pour chaque ligne dans A il y aura une ligne dans B. Pour relier A et B, nous utilisons C (nous ne peut pas changer le design de la table). Nous devons conserver les informations en une transaction. Existe-t-il un moyen de le faire en utilisant NHibernate?

Répondre

0

Je n'ai jamais eu à le faire moi-même, mais vous pouvez utiliser quelques mappages joined-table.

Et pour les opérations transactionnelles, simplement:

using(var session = TheSessionFactory.OpenSession()) { 
    using(var txn = session.BeginTransaction()) { 
     //transactional work 
     txn.Commit(); 
    } 
} 
0

Cela dépend de ce que votre structure de classe est ou ce que vous cherchez dans une structure de classe. Si ceux-ci sont vraiment les seules colonnes dans les tables, alors cette façon semble trop lourde et fait des moyens moins qu'optimaux pour accéder à X & Y (classC.A.X & classC.B.X) mais cela fonctionnerait. Peut-être que vous pourriez avoir des propriétés non-enregistrées sur ClassC qui ont fait ces appels pour vous d'une manière plus succincte.

<class name="ClassA" table="A"> 
    <id name="Id" column="ID"> 
     <generator class="native"/> 
    </id> 
    <property name="x" column="X" /> 
</class> 

<class name="ClassB" table="B"> 
    <id name="Id" column="ID"> 
     <generator class="native"/> 
    </id> 
    <property name="y" column="Y" /> 
</class> 

<class name="ClassC" table="C"> 
    <id name="Id" column="ID"> 
     <generator class="native"/> 
    </id> 
    <many-to-one name="A" class="ClassA" column="A_ID"/> 
    <many-to-one name="B" class="ClassB" column="B_ID"/> 
</class> 

Si C ne dispose que ces colonnes, vous pouvez changer cela d'utiliser un identifiant composite (regarder la docs). Ensuite, en fonction de vos besoins, vous pouvez configurer la cascade de façon à ce que vous ne fassiez que du désordre avec ClassC.

0

Ce que vous décrivez ici est un mappage de table plusieurs-à-plusieurs. il existe une propriété de mappage many-to-many. cela signifie que vous n'aurez pas besoin d'un mappage pour la table C.

Pour emprunter le mappage à partir de la réponse de Mark G.

<class name="ClassA" table="A"> 
    <id name="Id" column="ID"> 
     <generator class="native"/> 
    </id> 
    <property name="x" column="X" /> 
    <bag name="List_Of_B" table="C" cascade="all"> 
     <key column="AId"/> 
     <many-to-many column="BId" 
     class="B"/> 
    </bag> 
</class> 

<class name="ClassB" table="B"> 
    <id name="Id" column="ID"> 
     <generator class="native"/> 
    </id> 
    <property name="y" column="Y" /> 
    <bag name="List_Of_A" table="C" cascade="all"> 
     <key column="BId"/> 
     <many-to-many column="AId" 
     class="A"/> 
    </bag> 
</class> 
Questions connexes