J'essaie de comprendre quelle est la bonne façon de mapper la relation parent-enfant suivante. J'ai une classe parente qui contient des objets enfants. Cependant, le parent a aussi un pointeur vers une instance de l'un des enfants (PrimaryChild)Collection enfant de mappage NHibernate et instance incorporée de l'enfant
Class Parent
Public Property Id As Integer?
Public Property PrimaryChild As Child
Public Property Children As IList(Of Child)
End Class
Public Class Child
Public Property Id As Integer?
Public MyParent As Parent
End Class
L'utilisation est quelque chose comme
Dim ch As New Child
Dim par as New Parent
ch.MyParent = par
par.Children.Add(ch)
par.PrimaryChild = ch
Session.SaveOrUpdate(par)
Cependant, quand je fais ça, le PrimaryChild apparaît comme étant une valeur nulle ou transitoire. J'ai mis cascade = "all" dans la collection Children.
Des idées que je fais mal?
Update 1
Ajouté Mappages
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Parent" table="Parents">
<id name="Id" type="System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</id>
<set access="nosetter.camelcase-underscore" cascade="all-delete-orphan" inverse="true" name="Children" mutable="true">
<key>
<column name="ParentID" />
</key>
<one-to-many class="Child" />
</set>
<many-to-one cascade="save-update" class="Child" name="PrimaryChild">
<column name="PrimaryChildID" not-null="true" />
</many-to-one>
<many-to-one cascade="save-update" class="Child" name="SecondaryChild">
<column name="SecondaryChildID" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
<class xmlns="urn:nhibernate-mapping-2.2" mutable="true" name="Child" table="Child">
<id name="Id" type="System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<column name="ID" />
</id>
<many-to-one class="Parent" name="Parent">
<column name="ParentID" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
Salut Stefan, merci d'avoir répondu. Parent doit être inséré en premier, puis tous les enfants, puis parent doit être mis à jour pour définir la colonne PrimaryChild_FK à l'identité de l'enregistrement enfant correct. Pour que cela fonctionne, PrimaryChild_FK doit-il être NULL? Dans quel cas, quel devrait être le paramètre Cascade pour PrimaryChild? – James
Supprimez donc la contrainte non nulle de primaryChild_FK. Vous devrez peut-être également supprimer d'autres contraintes non nulles. Comme je l'ai dit: NH n'est pas assez intelligent pour changer l'ordre des insertions en fonction de contraintes non nulles. Je voudrais définir le PrimaryChild à cascade tout. –