2008-08-28 8 views
5

Je suis nouveau à NHibernate (mon premier grand projet avec).
J'avais utilisé une méthode simple d'accès aux données en créant l'objet ISession dans un bloc using pour faire mon grab mon objet ou liste d'objets, et de cette façon la session a été détruite après avoir quitté le bloc de code.Meilleure façon de gérer la session dans NHibernate?

Cela ne fonctionne pas dans une situation où le chargement paresseux est nécessaire, cependant.
Par exemple, si j'ai un objet Client qui possède une propriété qui est une collection de commandes, alors lorsque la charge paresseuse est tentée, j'obtiens une exception Hibernate.
Toute personne utilisant une méthode différente?

Répondre

6
+0

Juste une note, quelques mois plus tard. Alors que nous utilisons encore les approches ci-dessus, pour la plupart, il y a un travail plus intéressant fait par les gens qui travaillent sur l'utilisation d'un outil IOC pour gérer ISessions et ISessionFactory - peut-être envie de consulter StructureMap et FubuMvc projets pour plus d'informations. –

+1

@Matt: jetez un oeil à l'installation de NHibernate Castle, il existe depuis des années: http://www.castleproject.org/container/facilities/trunk/nhibernate/index.html –

+0

Les liens dans la réponse semblent être obsolètes . –

1

Gardez votre session ouverte pour l'ensemble de votre unité de travail. Si votre session est trop petite, vous ne pouvez pas bénéficier du cache de niveau session (ce qui est important). Chaque fois que vous pouvez empêcher un aller-retour dans la base de données, vous économiserez beaucoup de temps. Vous ne pouvez pas non plus profiter du chargement paresseux, ce qui est crucial à comprendre.

Si la durée de vie de votre session est trop importante, vous pouvez rencontrer d'autres problèmes.

S'il s'agit d'une application Web, le modèle session-per-httpRequest fonctionnera probablement très bien. Fondamentalement, il s'agit d'un HttpModule qui ouvre la session au début de la requête et vide/ferme à la fin. Assurez-vous de stocker la session dans HttpContext.Items PAS UNE VARIABLE STATIQUE. < --- conduit à toutes sortes de problèmes que vous ne voulez pas traiter.

Vous pouvez également consulter RhinoCommons pour une implémentation d'unité de travail.

+0

J'ai vu de nombreux exemples de cette méthode de gestion de session pour les applications web, mais l'utiliser avec des winforms est une autre histoire. Billy McCafferty fait de son mieux, mais ne donne aucun conseil sur la manière d'utiliser son cadre en winforms. Plus précisément, quand commencer et vider une transaction dans winforms. –

2

vérifier les diffusions sur le Web pour SummerOfNHibernate un tutoriel ... Qu'est-ce que vous cherchez en particulier ne vient pas avant webisode 5 ou 6.

Questions connexes