2011-08-18 12 views
7

Obecnie mam tej konfiguracji Fluent NHibernate:"current_session_context_class" Możliwe wartości NHibernate konfiguracji i opisy

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; 

    } 
} 

Moje pytanie jest o odsłoniętej własności "current_session_context_class". Znam dwie wartości: thread_static lub web. Mój kolega wskazał inną wartość, która jest połączenie. Czy są jakieś znane dokumenty dotyczące wartości tej nieruchomości? Jeśli nie, czy istnieją dobre opisy tych wartości? Przesiedziałem Google godzinami, aby uzyskać wyjaśnienia bez prawidłowego wyniku.

Odpowiedz

5

Oto moja próba wyjaśnienia te (dowolny dodatkowe wejście byłoby mile widziane):

Difference between CallSessionContext, ThreadLocalSessionContext and ThreadStaticSessionContext

Jest sekcja na nich w standardowej dokumentacji NH ale nie sądzę, robią to bardzo dobra robota, tłumacząc to lub podając przykłady, jak dokładnie z niego korzystać. Oto link do dokumentacji NH.

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

Istnieje kilka porządnych artykułów na StackOverflow o tym, jak użyć tego:
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

Twoje linki dostarczają najwięcej dokumentacji, którą widziałem. Dzięki. To nie jest wszechogarniający dokument, ale myślę, że to nie istnieje. – johnofcross

+0

Łącze NHForge jest zepsute. Czy ktoś ma zaktualizowany link? –

+1

@FrancoisBotha Naprawiłem link –

5

"managed_web", "zadzwoń", "thread_static" i "web" są możliwa wartość. Skonfigurowany tak w NHibernate konfiguracji:

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

Po to jest skonfigurowana, można użyć SessionFactory.GetCurrentSession(). Musisz samodzielnie związać i rozpiąć sesję. Jedna próbka realizacja:

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

Zamiast CallSessionContext, można również użyć ManagedWebSessionContext lub ThreadStaticSessionContext.

ManagedWebSessionContext - Nadaje się do aplikacji Asp.Net. Sesja jest dołączona do bieżącego HttpContext (dostarczanego jako parametr podczas wiązania).

ManagedWebSessionContext.Bind(HttpContext.Current,session) 

ThreadStaticSessionContext - Sesja jest dołączony do bieżącego wątku (nie będę zachęcać do korzystania to jako nici przełączania się gwałtownie a dołączone sesja może zostać utracone).

CallSessionContext - Nadaje się do aplikacji innych niż internetowe. Sesja jest dołączona do CallContext. Mogę się mylić, ale wyobrażam sobie to jako sesję związaną z samym SessionFactory. Tak długo, jak masz jedną SessionFactory dla całej aplikacji, to podejście zapewni, że nigdy nie uzyskasz współbieżnych aktywnych sesji.

+0

Jaka jest różnica między MangedWeb a Web? A może są tacy sami? – johnofcross

+0

@johnofcross, managedweb jest przestarzałe od 4.0.0.GA: * Usunięto ManagedWebSessionContext. Wszelkie pliki konfiguracyjne korzystające z kontekstu sesji "managed_web" powinny teraz używać "web" –