Fixation d'un objet déconnecté à un NHibernate session; les meilleures pratiques?
Mon référentiel travaille dans un UnitOfWork
modèle; toutes les opérations, que ce soit de la récupération ou de la persistance, doit être effectuée dans le cadre d'un IDisposable
UnitOfWork
jeton objet, qui, derrière les scènes, c'est associé à un Session
qui effectue le travail demandé. Ainsi, le motif de base est:
using (var uow = repo.BeginUnitOfWork())
{
try
{
//DB operations here; all repo methods require passing in uow.
...
repo.CommitUnitOfWork(uow);
}
catch(Exception)
{
repo.RollbackUnitOfWork(uow);
throw;
}
}
J'ai aussi mis en œuvre des méthodes de wrapper qui vous permettent de spécifier un lambda ou son délégué qui sera exécuté dans ce cadre, le soulagement de la nécessité de mettre en œuvre tous ces échafaudages à chaque fois.
Le problème, je vais avoir, c'est que l'utilisation de ce modèle, le code doit "savoir" ce que les besoins des utilisateurs, et désireux de charge à l'aide de NHUtil.Initialize()
dans le UnitOfWork
. Une fois le UOW est éliminé à la fin de l'utilisation de bloc, la Session associée avec toute PersistentBags
est fermé, et donc ils ne peuvent pas être évaluées. Comme désireux de chargement tout à l'avant n'est pas toujours possible et le genre de défaites le but d'un chargement différé ORM, je me suis mise en œuvre d'un Attach()
méthode.
Voici la question; En l'absence d'un haut- ISession.Attach()
méthode, il existe trois méthodes que j'ai vu recommandé d'associer un objet à une nouvelle Session. Lequel d'entre eux est la meilleure pratique pour faire le travail?
Un:
if(!Session.Contains(domainObject))
Session.Update(domainObject);
B:
Session.Merge(domainObject);
C:
Session.Lock(domainObject, LockMode.None);
Vous devez vous connecter pour publier un commentaire.
D: Aucun de ceux-ci. Effectivement la désactivation de chargement différé en gardant votre UOW trop court et de défaites le but d'un chargement différé ORM. Le fait que vous avez à ré-associer des objets déconnectés comme normale signifie que votre unité de travail les limites sont mal.
De fusion, mise à Jour, et de Verrouiller toutes ont des finalités différentes. Si vous êtes coincé avec votre architecture actuelle puis de Verrouillage est probablement ce que vous voulez.
session en cours, puis il est mis à jour
avec les modifications de l'objet fusionné,
sinon, c'est la même que la Serrure