2013-05-29 4 views
5

Возможно ли установить режим только для чтения для объектов, которые загружаются с использованием поставщика Linq от NHibernate?NHibernate Linq в режиме только для чтения

Например, можно сделать следующее с Session.QueryOver (и я считаю, с критериями, а):

Session.QueryOver(Of Foo)().ReadOnly() 

Есть ли equivilent для Session.Query доступны?

ответ

7

Как указано в документации 10.1.2. Loading persistent entities as read-only:

Чтобы изменить поведение по умолчанию, чтобы случаи NHibernate нагрузки сущностей изменяемых классов на сессии и автоматически делает их только для чтения, звоните:

Session.DefaultReadOnly = true; 

Чтобы изменить значение по умолчанию, чтобы объекты, загруженные NHibernate, не были сделали только для чтения, звоните:

Session.DefaultReadOnly = false; 

Так перед вызовом Session.Query... вызова Session.DefaultReadonly = true, потому что эта установка идет в ISession не Поставщик поверх него.

+0

Спасибо! Я не знал об этой настройке уровня сеанса. Странно, как они реализовали оператор «Только для чтения» для критериев и QueryOver, но не для провайдера Linq. – DanP

+1

@ DanP, это была бы хорошая и легкая функция для реализации. Вы можете открыть проблему на https://nhibernate.jira.com. Источник находится по адресу https://github.com/nhibernate/nhibernate-core. Это, вероятно, будет включать изменения в 'LinqExtensionMethods' и' NhQueryable'. –

+3

@DiegoMijelshon - Я открыл следующую проблему: https://nhibernate.jira.com/browse/NH-3470 – DanP

1

, если вам нужно читать только сессии, лучший подход здесь: how to create a readonly session in nHiberate?

Session.DefaultReadOnly = true; - в этом случае NHibernate будет аккумулировать все обновления для субъектов (вызов всех слушателей и т.д.)

session.FlushMode = FlushMode.Never 

в этом случае NHibernate не будет называть ни одного слушателя, поскольку я знаю