2010-11-16 3 views
4

NHibernate auto сохраняет любые изменения, внесенные в объект независимо от того, выполняете ли вы вызов session.save/update или нет при совершении транзакции. НАПРИМЕР.NHibernate - Сохранение изменений только при выполнении вызова сохранения/обновления

session.BeginTransaction(); 

User user = repos.getUser("tony"); 

user.Age = 34 

transaction.Commit(); 

Возраст обновлен. Это может раздражать, когда вы хотите получить объект из БД и внести некоторые изменения без сохранения этих изменений. Вы можете session.evict объекта, но тогда вы теряете возможность загрузки прокси.

Есть ли способ получить NHibernate только для сохранения изменений при вызове сохранения/обновления?

Update:

Спасибо за ответы, никто не сказал мне, как это сделать (и это не может быть возможно), так что я собираюсь оставить его без ответа.

Вы должны обернуть все вызовы db в транзакции и зафиксировать транзакцию, чтобы закрыть ее.

Я делаю это, потому что есть сложная сортировка. Я делаю результаты, которые на самом деле невозможны с помощью SQL/NHibernate. К сожалению, NHibernate предполагает, что я хочу сохранить этот новый заказ обратно в БД.

Мой обходной путь, чтобы добавить свойство к моему атрибуту сделки [сделка (onlyread = истина)], который заставляет его использовать FlushMode.Never

Я думаю, что для будущей работы я просто убедитесь, что только внести изменения, которые Я хочу упорствовать. Жаль, что есть возможность не только сохранять, когда вы это явно вызываете.

+2

Что произойдет, если вы поместите свой transaction.commit перед пользователем. – blindmeis

+0

Ну, вам не нужно открывать транзакцию ... – flq

+0

Почему вы хотите вносить изменения в сущность и не сохранять их? Возможно, ответ заключается в изменении дизайна, а не в том, как работает NHibernate. –

ответ

3

Вот как работают сеансы NHibernate для разработки.

Если вы предпочитаете делать все вручную, используйте вместо него IStatelessSession. Вы потеряете кеширование, ленивую загрузку и т. Д.

+0

Нет ли способа сделать это, играя с флешмодом? – DanP

+1

Да, вы можете установить его в 'Never', и он будет только скрываться явно. Но это предложение «все или ничего»: вы не можете выборочно очищать некоторые объекты. –

+0

Ваш второй комментарий - это то, что мне ответили. – Alistair

Смежные вопросы