2010-06-21 7 views
0

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

Répondre

1

Vous n'avez pas besoin d'appeler Update lorsque l'instance est déjà dans la session. NHibernate est assez intelligent pour trouver toutes les modifications apportées aux objets et les stocker dans la base de données. Pour placer une instance dans la session, vous utilisez généralement une requête pour obtenir des objets existants ou Save pour conserver une nouvelle instance. Update n'est utile que pour les instances détachées.

L'écriture de l'état de la mémoire dans la base de données est appelée Flush ing. NH vide avant de valider, mais aussi avant les requêtes, pour s'assurer que la requête est exécutée sur les données réelles (donc si vous définissez une propriété sur "A", vous pouvez immédiatement faire une requête qui filtre cette propriété par "A" et vous Je vais avoir votre exemple).

Je ne sais pas pourquoi NH enregistre une clé étrangère nulle. Est-ce que vous définissez la clé étrangère à null quelque part? Essayez-vous de "réutiliser" votre instance pour autre chose?

+0

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 :) –

Questions connexes