2012-10-16 31 views
12

Tôi đang sử dụng Fluent NHibernate cho ORM của tôi. Trong khi làm như vậy tôi đang cố gắng sử dụng cú pháp LINQ NHibernate để lấy một bộ dữ liệu với sức mạnh của LINQ. Mã tôi đã làm việc và thực hiện đúng với ngoại lệ là một thời gian chờ được ném nếu mất nhiều thời gian hơn khoảng 30 giây để chạy. Câu hỏi tôi có là làm cách nào để mở rộng thời gian chờ 30 giây mặc định cho các câu lệnh LINQ qua NHibernate?Làm thế nào để đặt thời gian chờ cho NHibernate LINQ tuyên bố

Tôi đã nhìn thấy các bài viết here, here, và here nhưng hai người đầu tiên đề cập đến thiết lập thuộc tính Timeout của DataContext, mà không áp dụng ở đây, và thứ ba liên quan đến thiết lập thời gian chờ trong XML, mà cũng không áp dụng bởi vì tôi đang sử dụng Fluent NHibernate để tạo XML một cách nhanh chóng. Không chỉ vậy, nhưng bài viết là 2 tuổi và Fluiber NHibernate đã thay đổi kể từ đó.

Với các đối tượng ICriteria và thậm chí HQL tôi có thể chỉ định thời gian chờ, tuy nhiên đó không phải là mục tiêu ở đây. Tôi muốn biết làm thế nào để thiết lập thời gian chờ đó và sử dụng LINQ.

Ví dụ mã:

using (var session = SessionFactory.OpenSession()) 
    using (var transaction = session.BeginTransaction()) 
    { 
     var query = (from mem in session.Query<Member>() 
        select mem); 
     query = query.Where({where statement}); 
     int start = (currentPage - 1) * max); 
     if (start > 0) 
      query = query.Skip(start).Take(max); 
     else 
      query = query.Take(max); 

     var list = query.ToList(); 
     transaction.Commit(); 
     return list; 
    } 

Mã này (trong đó tuyên bố không quan trọng) làm việc cho tất cả các mục đích trừ trường hợp một thời gian chờ xảy ra.

Mọi trợ giúp đều được đánh giá cao. Cảm ơn trước!

+0

Kiểm tra câu trả lời của kingpin2k. Làm việc tuyệt vời cho tôi. –

Trả lời

12

Tôi đã kết thúc thiết lập thời gian chờ của lệnh cho Cấu hình thành thạo NHibernate. Nhược điểm này là nó đặt thời gian chờ cho tất cả các cuộc gọi truy cập dữ liệu của tôi và không chỉ là một.

Ví dụ mã:

.ExposeConfiguration(c => c.SetProperty("command_timeout", (TimeSpan.FromMinutes(10).TotalSeconds).ToString())) 

tôi thấy đề nghị này từ this website.

+5

Bạn nên sử dụng không gian tên NHibernate.Cfg.Environment khi đặt thuộc tính NHibernate. Bằng cách đó, nếu phím thay đổi, bạn không bị mắc kẹt thay thế văn bản. Đối với thời gian chờ lệnh, bạn có thể làm như sau như Brandon đề xuất nhưng sử dụng hằng số: '.ExposeConfiguration (c => c.SetProperty (NHibernate.Cfg.Environment.CommandTimeout, TimeSpan.FromMinutes (5) .TotalSeconds.ToString()) ' –

+0

Tôi đã thử làm như vậy. Không hoạt động. Giá trị mặc định vẫn là 30 – Zuber

0

Tôi vừa mới dành số tiền hợp lý của thời gian chiến đấu với điều này và hy vọng điều này sẽ tiết kiệm được một số người khác thời gian.

Bạn nên sử dụng cuộc gọi phương thức .Timeout(120) vào đúng thời điểm cuối cùng để đảm bảo nó được sử dụng. TBH Tôi không chắc chắn 100% về lý do tại sao đây là nhưng đây là một số ví dụ:

SẼ LÀM VIỆC

query = query.Where(x => x.Id = 123); 

var result = query.Timeout(120).ToList(); 

KHÔNG LÀM VIỆC

query.Timeout(120); 

query = query.Where(x => x.Id = 123); 

var result = query.ToList(); 

Nếu làm như lần thứ hai (doesn' T WORK), có vẻ như nó quay trở lại System.Transaction.TransactionManager.DefaultTimeout mặc định.

+0

sau khi truy vấn làm việc cho chúng tôi tại $ làm việc – Malcolm

+0

Chúc mừng cho bất cứ ai chứng minh tôi sai với một bài kiểm tra thích hợp, nhưng tôi đã làm điều này bằng tay nhiều lần và sao chép nó mỗi lần tôi đồng ý nó sẽ làm việc sau khi truy vấn, miễn là bạn không thêm mệnh đề Where bổ sung và sau đó làm '.ToList(); ' –

+2

tôi nghĩ rằng bạn cần gán lại biến là query = query.Timeout (120); –

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