2011-09-17 6 views
6

j'ai suivi ce tutoriel: http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspxAucune session liée au contexte actuel

Je ne reçois pas une « aucune session liée au contexte actuel » erreur en essayant de charger une page (3 mvc).

public static ISessionFactory BuildSessionFactory() 
     { 

      return Fluently.Configure() 
       .Database(MsSqlConfiguration.MsSql2008 // 
           .ConnectionString(@"Server=.\SQLExpress;Database=db1;Uid=dev;Pwd=123;") 
           .ShowSql()) 
       //.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web")) 
       //.CurrentSessionContext<CallSessionContext>()    
       .Mappings(m => m.FluentMappings 
            .AddFromAssemblyOf<User>()) 
       .ExposeConfiguration(cfg => new SchemaExport(cfg) 
               .Create(false, false)) 
       .BuildSessionFactory(); 
     } 

L'erreur réelle est dans mon fichier Repository.cs:

Ligne 114: T virtuel public Get (id int) Ligne 115: { Ligne 116:. Retour _sessionFactory.GetCurrentSession() Inscrivez-vous (id); Ligne 117:} Ligne 118:

Lorsque je le déboguais, _sessionFactory n'était null ou null, il ne semble tout simplement pas trouver la session liée.

J'ai le httpmodule branché dans mon web.config, et il se lance donc ce n'est pas le problème.

Dans ma configuration de NHibernate, j'ai essayé les deux:

.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web")) 

et

.CurrentSessionContext<CallSessionContext>() 

Mais cela ne fonctionne pas.

+1

Quand vous dites "Dans ma configuration nhibernate, j'ai essayé les deux:", les exemples que vous donnez sont les mêmes. Pourriez-vous éditer votre question pour donner l'autre configuration que vous avez essayée! ^^ –

+1

essayez également de définir un point d'arrêt à l'intérieur des méthodes 'CurrentSession()' et Bind (', pour vous assurer qu'elles sont appelées. –

Répondre

8

Il semble que vous ne liez pas votre session au contexte. Regardez ci-dessous pour l'exemple:

public class SessionFactory 
{ 
    protected static ISessionFactory sessionFactory; 
    private static ILog log = LogManager.GetLogger(typeof(SessionFactory)); 

    //Several functions omitted for brevity 

    public static ISession GetCurrentSession() 
    { 
     if(!CurrentSessionContext.HasBind(GetSessionFactory())) 
      CurrentSessionContext.Bind(GetSessionFactory().OpenSession()); 

     return GetSessionFactory().GetCurrentSession(); 
    } 

    public static void DisposeCurrentSession() 
    { 
     ISession currentSession = CurrentSessionContext.Unbind(GetSessionFactory()); 

     currentSession.Close(); 
     currentSession.Dispose(); 
    } 
} 

La clé de ce qui précède est que chaque fois que vous récupérez votre première session vous liez à tout ce contexte que vous utilisez.

Questions connexes