Trong this question Tôi hỏi về tuổi thọ phiên NHibernate. Tôi đang sử dụng một ứng dụng máy tính để bàn, nhưng với khách hàng/máy chủ tách, vì vậy kết luận là tôi sẽ sử dụng một phiên cho mỗi yêu cầu máy chủ, như phía máy chủ là nơi mà tất cả các ma thuật NHibernate xảy ra.Làm thế nào để xử lý tuổi thọ phiên NHibernate bằng cách sử dụng dịch vụ?
Vấn đề của tôi bây giờ là cách xử lý. Tôi đã có problems before với tải dữ liệu được tham chiếu khi phiên được đóng sớm. Vấn đề là tôi thấy sau đây trên lớp tham chiếu của tôi khi gỡ lỗi - vì thế dữ liệu tham chiếu không được tải nào:
cơ sở {NHibernate.HibernateException} = { "Đang khởi [MyNamespace.Foo # 14] -failed để lười biếng khởi tạo một bộ sưu tập vai trò: MyNamespace.Foo.Bars, không có phiên hoặc phiên nào bị đóng "}
Từ những gì tôi hiểu nó không tải tất cả mặc dù tôi cam kết giao dịch. Vì vậy, tôi đã học được rằng tôi cần phải giữ cho phiên của tôi mở trong một thời gian, nhưng bao lâu?
Câu hỏi của tôi về cơ bản là nếu tôi đang xử lý đúng thời gian, hoặc những gì tôi nên thay đổi để đi đúng hướng. Thành thật mà nói tôi không thể thấy điều này có thể sai, vì vậy những gì tôi thực sự muốn là một cuộc gọi hàm để đảm bảo rằng dữ liệu tham chiếu được tìm nạp. Tôi là không phải bằng cách tải xuống chậm, vì vậy tôi nghĩ rằng chúng sẽ được tải ngay lập tức ..?
Kiến trúc hiện tại: Sử dụng lớp "hành vi dịch vụ" thực hiện giao dịch. Đây là IDisposable, vì vậy bản thân dịch vụ nó sử dụng một mệnh đề sử dụng xung quanh nó. NHibernateSessionFactory cung cấp một nhà máy tĩnh do đó sẽ được tái sử dụng.
// This is the service - the function called "directly" through my WCF service.
public IList<Foo> SearchForFoo(string searchString)
{
using (var serviceBehavior = new FooServiceBehavior(new NhibernateSessionFactory()))
{
return serviceBehavior.SearchForFoo(searchString);
}
}
public class FooServiceBehavior : IDisposable
{
private readonly ISession _session;
public FooServiceBehavior(INhibernateSessionFactory sessionFactory)
{
_session = sessionFactory.OpenSession();
}
public void Dispose()
{
_session.Dispose();
}
public IList<Foo> SearchForFoo(string searchString)
{
using (var tx = _session.BeginTransaction())
{
var result = _session.CreateQuery("from Foo where Name=:name").SetString("name", searchString).List<Name>();
tx.Commit();
return result;
}
}
Tệp XML không được sử dụng để ánh xạ - như bạn có thể thấy trong mã ví dụ. Đang sử dụng Fluent cho ánh xạ. – stiank81