Comment désactiver NHibernate automatique (dirty checking) mise à jour de comportement?
Je viens de découvrir que si je reçois un objet à partir d'un NHibernate session et modifier une propriété sur l'objet, NHibernate sera automatiquement mise à jour de l'objet sur valider sans m'appeler Session.Update(myObj)
!
Je peux voir comment cela pourrait être utile, mais comme comportement par défaut, il semble fou!
Mise à jour: je comprends maintenant l'ignorance de la persistance, de sorte que ce comportement est clairement la meilleure option. Je vais laisser maintenant cette embarrassante question ici, j'espère aider d'autres profane utilisateurs.
Comment puis-je arrêter ce qui se passe? Est-ce par défaut NHibernate comportement ou quelque chose venant de NHibernate Fluent du AutoPersistenceModel?
Si il n'y a aucun moyen d'arrêter cela, que dois-je faire? À moins que je manque le point ce comportement semble créer un droit mess.
Je suis en utilisant NHibernate 2.0.1.4 et Couramment NHibernate construire à partir de 18/3/2009
Est ce mec à droite avec sa réponse?
J'ai aussi lu que la substitution d'une Écouteur d'Événement pourrait être une solution à cette question. Cependant, IDirtyCheckEventListener.OnDirtyCheck
n'est pas appelé dans cette situation. Personne ne sait qui auditeur j'ai besoin de remplacer?
- Je ne pense pas que c'est nécessaire de dire que la personne de poser cette question est "profane". Pour des exemples, il y a beaucoup de fois quand je veux charger un objet et je sais que je ne vais pas apporter de modifications. Je ne veux pas NHibernate perdre de temps à vérifier si elle a changé.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir
Session.FlushMode
àFlushMode.Never
. Cela rendra vos opérations expliciteie: sur
tx.Commit()
ousession.Flush()
. Bien sûr, ce sera encore de mise à jour de la base de données lors de la livraison/chasse d'eau. Si vous ne voulez pas ce comportement, puis d'appelersession.Evict(yourObj)
et il deviendra alors transitoires et NHibernate n'émettra aucune db commandes pour elle.Réponse à votre edit: Oui, le gars qui vous donne plus d'options sur la façon de la contrôler.
Ma solution:
Appel SaveOrUpdate() ou Enregistrer() rend un objet persistant. Si vous avez récupéré à l'aide d'un ISession ou à partir d'une référence à un objet persistant, alors l'objet est persistant et rinçage de la session permettra d'enregistrer les modifications. Vous pouvez éviter ce problème en appelant Evict() sur l'objet qui le rend transitoire.
Édité à ajouter: je suis généralement envisager une ISession à une unité de travail. Ceci est facilement mis en œuvre dans une application web. à l'aide de session-par-requête, mais nécessite plus de contrôle dans les WinForms.
Nous l'avons fait en utilisant les Écouteurs d'Événement avec NH (Ce n'est pas mon travail mais je ne trouve pas le lien où je l'ai fait...).
Nous avons un EventListener pour lors de la lecture dans les données, pour le définir comme ReadOnly - et puis, un pour Enregistrer (et SaveOrUpdate) pour les mettre en tant que chargé, donc que objet persistent lorsque nous avons manuellement appel
Save()
sur elle.Que - ou vous pouvez utiliser un IStatelessSession qui n'a pas d'État/ChangeTracking.
Cela définit l'entité/item en ReadOnly immédiatement sur le chargement.
Je ne l'ai inclus un événement d'Insertion de l'auditeur, mais ma config références de code tous.
Sur la sauvegarde de l'objet, nous appelons cela de définir l'objet de Chargé (ce qui signifie qu'il sera désormais persistent)
Et nous de mettre en œuvre dans NH donc: