2011-08-18 15 views
7

Al momento ho questa configurazione Fluent NHibernate:NHibernate configurazione "current_session_context_class" Valori e descrizioni possibili

public class NHibernateConfig 
{ 
    public static Configuration Configure() 
    { 
     var cfg = Fluently.Configure() 
      .Database(Config.PersistenceConfiguration) 
      .Mappings(m => 
          { 
           m.FluentMappings.AddFromAssemblyOf<SomeAssembly>(); 
           m.FluentMappings.Conventions.AddFromAssemblyOf<EnumConvention>();        }) 
      .ExposeConfiguration(x => x.SetProperty("current_session_context_class", "thread_static")) 
      .BuildConfiguration(); 
     return cfg; 

    } 
} 

La mia domanda riguarda la proprietà esposta "current_session_context_class." Conosco due valori per questo: thread_static o web. Un mio collega ha sottolineato un altro valore, che è chiamata. Esistono documenti noti per i valori di questa proprietà? In caso contrario, esistono buone descrizioni di questi valori? Ho setacciato Google per ore per alcune spiegazioni senza risultati validi.

risposta

5

Ecco il mio tentativo di spiegare questi (qualsiasi ingresso aggiuntivo sarebbe il benvenuto):

Difference between CallSessionContext, ThreadLocalSessionContext and ThreadStaticSessionContext

C'è una sezione su queste nella documentazione standard NH, ma non credo che fanno un buon lavoro spiegandolo o dando qualche esempio su come esattamente usarlo. Ecco il link alla documentazione di NH.

http://nhibernate.info/doc/nhibernate-reference/architecture.html#architecture-current-session

Ci sono diversi articoli decenti su StackOverflow su come si usa questo:
What is the best NHibernate session management approach for using in a multithread windows service application?
NHibernate.HibernateException: No session bound to the current context

+0

I collegamenti in realtà forniscono la maggior parte della documentazione che ho visto per questo. Grazie. Non è un documento onnicomprensivo, ma immagino che non esista. – johnofcross

+0

Il collegamento NHForge è rotto. Qualcuno ha un link aggiornato? –

+1

@FrancoisBotha Ho corretto il collegamento –

5

"managed_web", "chiamare", "thread_static", e "web" sono valori possibili. Configurato come questo in configurazione di NHibernate:

<property name="current_session_context_class">call</property> 

Una volta che questo è configurato, è possibile utilizzare SessionFactory.GetCurrentSession(). Devi legare e separare la sessione da solo. Un esempio di implementazione:

if (CallSessionContext.HasBind(_sessionFactory)) 
      { 
       session = SessionFactory.GetCurrentSession(); 
      } 
      else 
      { 
       session = SessionFactory.OpenSession(); 
       CallSessionContext.Bind(session); 
      } 

Invece di CallSessionContext, è anche possibile utilizzare ManagedWebSessionContext o ThreadStaticSessionContext.

ManagedWebSessionContext - Adatto per l'applicazione Asp.Net. La sessione è collegata all'attuale HttpContext (fornita come parametro durante l'associazione).

ManagedWebSessionContext.Bind(HttpContext.Current,session) 

ThreadStaticSessionContext - Sessione è attaccato al thread corrente (I wont incoraggio usando questo come le discussioni mantenere il passaggio di scatto e la sessione allegata potrebbero essere persi).

CallSessionContext - Adatto per applicazioni non Web. La sessione è allegata a CallContext. Potrei sbagliarmi ma immagino che questo sia una sessione collegata a SessionFactory stessa. Finché hai una SessionFactory per l'intera applicazione, questo approccio ti assicurerà che non avrai mai sessioni attive simultanee.

+0

Qual è la differenza tra MangedWeb e Web? O sono gli stessi? – johnofcross

+0

@johnofcross, managedweb è obsoleto a partire dalla 4.0.0.GA: * Rimosso ManagedWebSessionContext. Qualsiasi file di configurazione che utilizza il contesto di sessione "managed_web" dovrebbe ora utilizzare "web" –

Problemi correlati