web-dev-qa-db-fra.com

L'objet NHibernate fait référence à une instance transitoire non enregistrée, sauvegardé à l'instance transitoire avant le vidage

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.

14
Naganathan

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.

14
Firo

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
2
BrennQuin

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 " />
1
AmirHossein Rezaei