2010-01-08 39 views
7

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

Trả lời

5

Hóa ra tôi đang làm chậm tải. Tôi đã có ánh xạ sau:

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Not.LazyLoad(); 
     Id(c => c.Id).GeneratedBy.HiLo("1"); 
     Map(c => c.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Bars).Cascade.All(); 
    } 
} 

Tôi giả định Not.LazyLoad() vô hiệu hóa tải chậm, nhưng dường như không dành cho đối tượng được tham chiếu. Tôi thêm tải lười biếng vào tài liệu tham khảo, và điều này dường như đã cố định vấn đề.

public class FooMapping : ClassMap<Foo> 
{ 
    public FooMapping() 
    { 
     Not.LazyLoad(); 
     Id(c => c.Id).GeneratedBy.HiLo("1"); 
     Map(c => c.Name).Not.Nullable().Length(100); 
     HasMany(x => x.Bars).Not.LazyLoad(); // <---------- 
    } 
} 

Cảm ơn thời gian của bạn và tôi vẫn rất vui khi thấy ý kiến ​​của bạn về việc liệu cấu trúc của tôi có hợp lý hay không.

-1

Nếu tệp xml được sử dụng cho mục đích lập bản đồ, chúng tôi có thể đặt lazy = false cho túi.

+0

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

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