2009-05-01 8 views
13

Tôi đang thực hiện cập nhật tiêu chuẩn trong NHibernate thành một thuộc tính duy nhất. Tuy nhiên trên cam kết của giao dịch, bản cập nhật sql dường như thiết lập tất cả các trường tôi đã ánh xạ trên bảng mặc dù chúng không thay đổi. Chắc chắn đây không phải là hành vi bình thường trong Nhibernate? Tôi có làm điều gì sai? Cảm ơnCập nhật NHibernate trên thuộc tính đơn cập nhật tất cả các thuộc tính trong sql

using (var session = sessionFactory.OpenSession()) 
      { 
       using (var transaction = session.BeginTransaction()) 
       { 
        var singleMeeting = session.Load<Meeting>(10193); 
        singleMeeting.Subject = "This is a test 2"; 

        transaction.Commit(); 
       } 
      } 
+0

vừa gặp phải tình huống tương tự. Tôi nghĩ rằng đây là một mặc định xấu và tôi sẽ tìm kiếm các cuộc thảo luận trực tuyến trong các diễn đàn thích hợp. điều này đã gây ra lỗi trong ứng dụng máy chủ mà tôi đang làm việc - vì nó thay đổi logic ứng dụng, thường trong trường hợp các hành động đồng thời trong đó một đối tượng được tạo, sau đó tìm nạp, lấy bởi một luồng/quá trình khác (phiên khác), sửa đổi và cập nhật (cập nhật các trường không liên quan riêng biệt). bản cập nhật cuối cùng sẽ chạy trên các thay đổi trong giao dịch trước đó ... Tôi đã tham khảo ý kiến ​​này với các đồng nghiệp của mình và chúng tôi nghĩ hiệu suất đạt được không phải là quyết liệt. –

+0

@YonatanKarni, điều này không chỉ về hiệu suất mà còn về tính nhất quán. Xem [câu hỏi] này (/ q/13954882/1178314) và [câu trả lời hiện tại được chấp nhận] của nó (/ a/13955305/1178314). –

Trả lời

16

Đây là hành vi bình thường. Bạn có thể thử thêm dynamic-update="true" vào định nghĩa lớp học của mình để ghi đè hành vi này.

3

Vâng. có đây là hành vi bình thường cho NHibernate. Bạn có thể sử dụng thuộc tính được tạo cho thuộc tính của mình để thay đổi hành vi. Chi tiết trên Ayende's blog.

Tại sao mặc định này là do động lực bạn không nhận được gói bộ nhớ truy vấn được lưu trong bộ nhớ cache. Và thông thường bạn không nhớ rằng bạn gửi thêm vài byte qua kết nối mạng tốc độ cao giữa máy chủ ứng dụng và cơ sở dữ liệu của bạn. Trừ khi bạn đang lưu các chuỗi dài nơi cài đặt này hoàn toàn phù hợp.

+0

Trong khi Được tạo nghĩa là trường sẽ không được gửi thông qua bản cập nhật, điều đó cũng có nghĩa là trường được xử lý phía máy chủ. Thay vào đó, NabilS đang tìm kiếm những trường được gửi đã thay đổi. –

+0

Trên thực tế, bài đăng trên blog không cung cấp các chi tiết được yêu cầu vì nó có liên quan đến cấp Thuộc tính. Câu trả lời của @ Darin là ở cấp lớp, đó là nơi bạn muốn có thể thay đổi hành vi này. – Jonno