J'essaie de sauvegarder un objet complexe contenant de nombreux éléments référencés et qui fonctionne parfaitement la plupart du temps.
Cependant, dans certains cas, nous avons l'exception ci-dessous,
object fait référence à une instance transitoire non enregistrée - enregistrez-la avant le vidage ou définissez l'action en cascade de la propriété sur quelque chose qui la rendrait automatiquement. Type: Namespace.Core.Client.ClientDetails, Entity: Namespace.Core.Client.ClientDetails
Le problème est qu’il ya environ 12 éléments ClientDetails dans mon objet complexe que nous essayons de sauvegarder. Existe-t-il un moyen d’identifier quelle instance d’objet a provoqué ce problème? Via la journalisation NHibernate ou d’une autre manière? Mon exemple de code utilisé pour enregistrer comme ci-dessous,
_repository.Save<SuperParent>(obj);
_repository.Flush();
Veuillez noter que lorsque je mets la valeur Nhibernate show_sql à true, je suis en mesure de voir toutes les requêtes correctement générées, mais lorsque le flush est appelé, l’exception est levée.
S'il vous plaît aider à résoudre le problème.
L'exception signifie qu'il existe une instance non enregistrée de ClientDetails
référencée par cet objet. Vous devez soit le sauvegarder manuellement avant de sauvegarder le parent
session.Save(Parent.SomeDetail);
ou définissez Cascade.SaveOrUpdate
sur les mappages de référence dans le mappage parent.
Si vous lisez attentivement:
... il s'agit d'une instance transitoire avant le vidage ou définit l'action en cascade pour la propriété sur quelque chose qui la rendrait automatiquement
Donc, vous pouvez peut-être ajouter Cascade à la référence, comme ceci:
References(x => x.ClientDetails).Cascade.All().Column("ClientDetailsId")
.Not.Nullable(); //Or nullable, this depends on your schedule
Modifiez votre mappage avec cascade all changes . Si vous avez une classe de client comportant de nombreux ClientDetails, votre mappage xml ressemblerait à ceci
Dans le fichier Client.hbm.xml, vous devriez avoir:
<set name = "ClientDetails" table = "`ClientDetail`" cascade = "all-delete-Orphan" inverse="true">
<key column = "ClientId"/>
<one-to-many class = "ClientDetail"/>
</set>
Dans le fichier ClientDetail.hbm.xml, vous devriez avoir:
<many-to-one name = "Client" class = "Client" column = "ClientId " />