2009-11-03 4 views
0

J'utilise NHibernate pour mon projet. Je suis un débutant à travailler sur NHibernate. J'utilise le mappage de relations many-to-many "users" et "roles". Voici le code pour obtenir l'utilisateur:NHibernate many to many et ISession.Close()

public User GetUser(int userId){ 
    using(ISessuib session = new SessionManager().GetSession()) 
    { 
    return session.Get<User>(userId); 
    } 
} 

public void LazyLoadUsingSessionTest(){ 
    var user= GetUser(1); 
    Assert.NotNull(user.Roels); 
} 

il lance une exception: n'a pas réussi à initialiser paresseusement une collection, aucune session ou session fermée

si je ne pas utiliser le « à l'aide » déclaration dans la méthode "GetUser", cela fonctionne. Mais je dois appeler le session.Close() pour libérer la ressource

quand je l'utilise dans une page web, je veux seulement utiliser le GetUser(), pas le ISession object.so ma question est: Cela signifie-t-il que je dois avoir un objet ISession (pour relire le resous) dans ma page web? ou une meilleure solution? (parce que je ne veux pas l'objet ISession apparaît dans mes fichiers aspx.cs)

merci!

Répondre

2

Vous devez utiliser la session par demande modèle. Voir ce link pour une explication des meilleures pratiques pour l'utilisation de NHibernate avec ASPX.

-1

La façon la plus simple est d'utiliser NHibernateUtil.Initialize (lire here pour plus de détails):

using(ISession session = new SessionManager().GetSession()) 
{ 
    User user = session.Get<User>(userId); 
    NHibernateUtil.Initialize(user.Roles); 
    return user; 
} 

Cependant, vous tôt ou tard besoin de gérer en quelque sorte les sessions dans votre application. Je recommande de créer une couche de fournisseur de données qui vous donnerait accès à la base de données. La couche fournisseur de données gérera la création et la destruction des sessions. Vous pouvez avoir une session par requête ou par conversation (ISession unique pour la durée d'une session ASP.Net).

La série vidéo Summer Of NHibernate serait utile. Les sessions 5 et 13 sont les plus pertinentes pour vous.

+0

Désolé, mais c'est un mauvais conseil. De cette façon, vous détruisez le chargement paresseux et l'isolation des transactions en même temps, tout en faisant exploser le code avec beaucoup d'ordures. –