2011-09-17 20 views
6

sesión que siguió a este tutorial: http://nhforge.org/blogs/nhibernate/archive/2011/03/03/effective-nhibernate-session-management-for-web-apps.aspxunido al contexto actual

No estoy recibiendo un 'no hay ninguna sesión unido al actual contexto' error al intentar cargar una página (MVC 3).

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(); 
     } 

El error real es en mi archivo Repository.cs:

Línea 114: public T Get virtual (int id) Línea 115: Línea { . 116: devolver _sessionFactory.GetCurrentSession() Obtener (carné de identidad); Línea 117:} Línea 118:

Cuando lo estaba depurando, _sessionFactory no era nulo ni nada, simplemente no puede encontrar la sesión enlazada.

que tienen la HttpModule cableada en mi web.config, y se pone ejecute de manera que no es el problema.

En mi configuración nhibernate, he intentado tanto:

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

y

.CurrentSessionContext<CallSessionContext>() 

Pero eso no funcionó.

+1

Cuando se dice "En mi configuración nhibernate, he intentado tanto:", los ejemplos que das son ambos el mismo. ¿Podría editar su pregunta para dar la otra configuración que ha intentado! ^^ –

+1

también tratar de establecer un punto de interrupción en el interior del 'currentSession()' y 'bind (' métodos, para asegurarse de que están siendo invocados. –

Respuesta

8

Parece que no son vinculantes para la sesión con el contexto. Mira el abajo para un ejemplo:

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 clave de lo anterior es que siempre que recupere su primera sesión se enlaza a cualquier contexto que está utilizando.

Cuestiones relacionadas