Каков наилучший подход для обновления только измененных свойств в NHibernate при отключении сеанса? - PullRequest
25 голосов
/ 07 августа 2009

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

Например, когда мне нужно получить объект из базы данных, я открываю сеанс, затем вызываю session.Get () и закрываю сеанс. Затем я обновляю некоторые свойства отдельного объекта. Когда мне нужно сохранить изменения в базе данных, я вызываю метод, который открывает сеанс, вызывает session.Update (myObject) и закрывает сеанс.

Но когда я это делаю, NHibernate генерирует sql, который обновляет все поля, которые я отобразил, даже если они не изменились. Я предлагаю, когда объекты отсоединяются от сессии, NHibernate не может отследить внесенные изменения. Какой подход вы используете, когда хотите обновить только свойства, которые были изменены для объекта, отсоединенного от сеанса? Как вы отслеживаете изменения для отдельных объектов?

Спасибо

Ответы [ 2 ]

16 голосов
/ 07 августа 2009

Вопрос в том, почему вы хотите это сделать? Я думаю, что оптимизация невелика, если вы обновляете только измененные столбцы.

У вас есть триггеры в базе данных?

Если это так, вы можете сделать следующее:

  • используйте select-before-update="true" и dynamic-update="true" в отображении. Это заставляет NH выполнять запрос перед обновлением и обновлять его только в том случае, если оно изменилось, и только те столбцы, которые изменились. Я не уверен, выбирает ли он каждое обновление или только если его нет в сеансе.
  • используйте Merge вместо обновления. Это фактически делает то же самое: он выбирает объект из базы данных, только если он еще не находится в сеансе. Также используйте dynamic-update="true". Существует также компромисс: Merge возвращает присоединенный экземпляр, если он уже есть в сеансе. Поэтому вы всегда должны выбрасывать экземпляр, который вы проходили, и работать с экземпляром, с которого вы переходите Merge.

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

6 голосов
/ 07 августа 2009

Использовать dynamic-update = "true" в отображении .
Дополнительно для обновления отдельного объекта используйте это:

Session.SaveOrUpdateCopy(myObject)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...