2010-06-20 3 views
1

je relation parent/enfant, et l'enfant ont id compositeNHibernate - problème avec des collections fusion

Parent

<id name="Id" type="Int32"> 
     <generator class="identity" /> 
    </id> 

<set name="Children" table="CTable" cascade="all-delete-orphan" inverse="true" lazy="false" > 
    <key column="ParentId"/> 
    <one-to-many class="ChildrenClass"/> 
</set> 

enfant

<composite-id unsaved-value="none"> 
    <key-property name="ParentId"/> 
    <key-property name="ChildId"/> 
</composite-id> 

Ce que je veux: 1) Inscrivez-vous Parent à partir de la base de données, fermez la session, passez Parent du service au client 2) Lorsque Parent est de retour du client, enregistrez-le et tous ses enfants dans la base de données, dans un nouvelle session

À l'étape 2, j'appelle var merged = Session.Merge (product); J'utilise Merge() car il semble que le seul moyen de faire en sorte que NHib gère les éléments ajoutés/supprimés dans la collection enfants .. MAIS nHibernate réinitialise tous les id-s des enfants nouvellement ajoutés, donc j'ai de nouveaux enfants avec ParentId == 0 et ChildId == 0. Donc la question est - comment dire à NHibernate de garder les ids de l'entité qui est passée dans Merge()? .. S'il vous plaît aider.

Répondre

0

Votre mappage (et le modèle de classe) est incorrect.

L'enfant doit avoir une référence à Parent, pas un Id. Et la cartographie devrait être un <key-many-to-one/>

+0

Merci pour votre réponse! Si j'ajoute dans Child reference to Parent, comment pourrais-je maintenir la collection d'enfants dans le parent? Quand les deux références Parent.Children & Child.Parent sont présentes, cela conduit à StackOverflowException (évidemment) .. J'aimerais avoir une collection d'enfants dans le parent pour que je puisse naviguer à travers eux .. Est-ce possible? – Dmitry

+0

"De toute évidence"? Vous avez tort. Les relations bidirectionnelles sont entièrement prises en charge par NHibernate. Je suggère que vous lisiez les docs en premier. –

+0

Diego, j'ai réussi à le faire fonctionner, je ne sais pas pourquoi ça n'a pas été le cas pour la première fois. Merci! – Dmitry

Questions connexes