2011-08-18 24 views
7

Tôi hiện đang có cấu hình này thành thạo NHibernate:NHibernate Configuration "current_session_context_class" giá trị có thể và mô tả

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; 

    } 
} 

Câu hỏi của tôi là về bất động sản tiếp xúc với "current_session_context_class." Tôi biết hai giá trị cho điều này: thread_static hoặc web. Một đồng nghiệp của tôi đã chỉ ra một giá trị khác, là gọi. Có bất kỳ tài liệu đã biết nào về giá trị của tài sản này không? Nếu không, có mô tả hay cho các giá trị này không? Tôi đã lùng sục Google hàng giờ vì một số giải thích không có kết quả hợp lệ.

Trả lời

5

Đây là nỗ lực của tôi để giải thích này (Bất kỳ đầu vào bổ sung sẽ được hoan nghênh):

Difference between CallSessionContext, ThreadLocalSessionContext and ThreadStaticSessionContext

Có một phần bằng các trong tài liệu NH chuẩn nhưng tôi không nghĩ rằng họ làm rất tốt công việc giải thích nó hoặc đưa ra bất kỳ ví dụ về cách chính xác để sử dụng nó. Đây là liên kết tài liệu NH.

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

Có một số bài báo đàng hoàng trên StackOverflow về cách bạn sẽ sử dụng này:
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

Các liên kết của bạn thực sự cung cấp hầu hết tài liệu tôi đã xem cho điều này. Cảm ơn. Đó không phải là tài liệu toàn diện, nhưng tôi đoán điều đó không tồn tại. – johnofcross

+0

Liên kết NHForge bị hỏng. Bất kỳ ai cũng có liên kết được cập nhật? –

+1

@FrancoisBotha Tôi đã sửa liên kết –

5

"managed_web", "gọi", "thread_static", và "web" là những giá trị khả thi. Cấu hình như thế này trong cấu hình nhibernate:

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

Khi cấu hình này, bạn có thể sử dụng SessionFactory.GetCurrentSession(). Bạn phải tự ràng buộc và hủy liên kết phiên. Một triển khai mẫu:

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

Thay vì CallSessionTiếp theo, bạn cũng có thể sử dụng ManagedWebSessionContext hoặc ThreadStaticSessionContext.

ManagedWebSessionContext - Thích hợp cho ứng dụng Asp.Net. Phiên được đính kèm với HttpContext hiện tại (được cung cấp dưới dạng tham số trong khi ràng buộc).

ManagedWebSessionContext.Bind(HttpContext.Current,session) 

ThreadStaticSessionContext - Session được đính kèm với chủ đề hiện tại (Tôi không khuyến khích sử dụng làm chủ đề đột ngột và phiên đính kèm của bạn có thể bị mất).

CallSessionContext - Thích hợp cho các ứng dụng không phải web. Phiên được đính kèm với CallContext. Tôi có thể sai nhưng tôi tưởng tượng điều này như là phiên gắn liền với SessionFactory chính nó. Miễn là bạn có một SessionFactory cho toàn bộ ứng dụng, cách tiếp cận này sẽ đảm bảo bạn sẽ không bao giờ nhận được các phiên hoạt động đồng thời.

+0

Sự khác nhau giữa MangedWeb và Web là gì? Hoặc là những người như vậy? – johnofcross

+0

@johnofcross, managedweb không được chấp nhận kể từ 4.0.0.GA: * Removed ManagedWebSessionContext. Mọi tệp cấu hình sử dụng ngữ cảnh phiên "managed_web" giờ đây sẽ sử dụng "web" –

Các vấn đề liên quan