2009-04-20 25 views
15

Có thể tạo kết nối chỉ đọc trong nHibernate không?cách tạo phiên chỉ đọc trong nHiberate?

Chỉ đọc: trong đó nHibernate sẽ không xóa bất kỳ thay đổi nào đối với cơ sở dữ liệu cơ bản ngầm hoặc rõ ràng.

Khi đóng kết nối nhibernate, nó sẽ tự động xóa các thay đổi đối với đối tượng liên tục.

Đặt chế độ xả thành không bao giờ là một cách - nhưng có thể đảo ngược (nghĩa là một số mã có thể đặt lại chế độ xả).

+0

Tôi biết đây là câu hỏi cổ (trong Internet), nhưng lý do khiến bạn lo ngại về điều này là "đảo ngược"? –

Trả lời

13

Tôi nghĩ bạn đã tìm được giải pháp, thiết lập chế độ tuôn ra để không bao giờ. Có, nó có thể thay đổi nhưng ngay cả khi nó không được, mã có thể chỉ đơn giản là tạo ra một phiên khác có một chế độ tuôn ra khác nhau.

Tôi nghĩ rằng giải pháp thích hợp là để đề nghị chỉ đọc với session.FlushMode = FlushMode.Neverthực thi nó bằng cách sử dụng một kết nối đến cơ sở dữ liệu mà chỉ có quyền SELECT (hoặc bất cứ điều gì là thích hợp cho tình hình của bạn). Duy trì các nhà máy ISessionFactory riêng biệt có thể giúp bằng cách cho phép một số thứ như ReadOnlySessionFactory.Create().

0

Tích lũy cập nhật, và chỉ cần không bao giờ xả nước có vẻ như một giải pháp xấu với tôi. Tôi đã đăng một câu hỏi tương tự. Giải pháp được cung cấp sử dụng một cách tiếp cận khác. Tất cả các sự kiện được đặt thành rỗng và do đó bị bỏ qua. Cảm giác của tôi là nó là một cách tiếp cận tốt hơn.

Tôi ngạc nhiên rằng điều này không dễ làm. Tôi thích cách tiếp cận khung thực thể của việc sử dụng một phương thức mở rộng .AsNoTracking() để đảm bảo rằng các truy vấn chỉ đọc duy nhất theo cách đó.

How to create an NHibernate read-only session with Fluent NHibernate that doesn't accumulate updates?

+0

Không, cập nhật không tích lũy sau khi cài đặt phiên.FlushMode = FlushMode.Never. Tôi đã kiểm tra nó bằng cách ghi đè SaveOrUpdateEventListeners như trong câu hỏi của bạn, và người nghe không gọi với FlushMode.Never. Trong giải pháp NoOpEventListener của bạn được gọi cho mỗi thay đổi – razon

1

Có một tính năng chỉ đọc mới hơn trong NHibernate (Tôi không biết phiên bản nào, nhưng đó là trong 3.3.0 cho chắc chắn). Bạn có thể đặt phiên để chỉ đọc bằng cách sử dụng:

session.DefaultReadOnly = true 

Nó vô hiệu hóa bộ nhớ cache cho giá trị cũ và do đó cải thiện hiệu suất và mức tiêu thụ bộ nhớ.

Có một số chapter about read-only entities trong số NHibernate reference documentation.

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