Je suis témoin d'un comportement étrange de Fluent nHibernate. J'ai deux objets impliqués dans ce problème: un objet "Page" et un objet "Métadonnées". Une page peut avoir plusieurs objets de métadonnées attachées, et la mise en correspondance est ainsi fait:Fluid nHibernate null id - laisse orphelins
'in PageMap
HasMany(Function(x) x.MetaData).Cascade.All()
'in MetaDataMap
References(Function(x) x.Page)
Le problème se produit sur le processus de sauvegarde. Lorsque je souhaite enregistrer les modifications apportées à l'objet de page, j'obtiens l'objet page existant, exécute la liste des modifications, puis utilise Session.Update (Page) pour enregistrer les valeurs. Le comportement impair est que les données ne sauvent, mais la page Metadata est enregistrée deux fois: une fois comme prévu, et une autre fois avec page_id de null. Ce qui est étrange, c'est que cela se produit même lorsque je commente la commande Mise à jour - ce n'est donc pas la mise à jour qui provoque l'enregistrement des données! En parcourant le code et en regardant les données, j'ai tracé l'erreur jusqu'au point où j'utilise nHibernate pour obtenir un objet Page à utiliser ses détails. Ainsi, avant d'appeler cette méthode, la base de données n'indique aucune modification de métadonnées. Par la suite, je ne peux pas voir la base de données (elle est occupée) mais la page qui a été retournée contient des métadonnées ajoutées. La méthode get ressemble à ceci:
Public Function GetById(ByVal Id As Integer) As Cms.DataTransferObjects.Page Implements IPageManager.GetById
Dim session As ISession = NHibernateSessionManagerStore.Instance.GetSession()
Dim results As Cms.DataTransferObjects.Page
results = session.CreateCriteria(Of DataTransferObjects.Page)() _
.Add(Expression.Like("Id", Id)) _
.UniqueResult(Of DataTransferObjects.Page)()
Return results
End Function
Donc, il n'y a évidemment rien qui sauvegarde les données.
Quelqu'un peut-il nous éclairer à ce sujet? Ça me rend berserk!
Cheers, Matt
Merci pour cette explication très utile. Comme il s'avère que je créais de nouveaux objets orphelins ailleurs dans le code, et était confus parce qu'ils ne sont pas commis à la DB tout de suite. Je doute que j'aurais repéré ça sans votre réponse :) –