NHibernate: могу ли я предотвратить загрязнение объекта настройками полей аудита?

Обычная вещь, которую многие люди делают с NHibernate, - это установка полей аудита (например, CreatedDate, LastModifiedDate) при сохранении объекта. В блогах есть много сообщений о том, как делать подобные вещи с помощью событий NHibernate.

Здесь используется событие SaveUpdate: http://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.html.

Здесь используются события PreInsert и PreUpdate: http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx

SaveUpdate кажется лучшим местом для этого, и я предполагаю, что именно здесь большинство людей обычно это делают. Вот проблема: у меня отношение "один ко многим", настроенное как cascade = "save-update". Когда я сохраняю родительский объект, он запускает все дочерние объекты через событие SaveUpdate. Но когда я установил там поля аудита, это просто испортило дочернюю сущность! Теперь он всегда обновляет каждую строку в дочерней коллекции.

Я могу перенести аудит в PreInsert / PreUpdate, но тогда у меня возникнут другие проблемы (я использую NHibernate Validator для проверки, который устанавливает ограничения на столбцы для экспорта схемы, поэтому NHibernate даже не попадает в PreInsert, потому что поля аудита null и столбцы db не являются столбцами NULL).

Для меня самым простым решением было бы, если бы был способ установить поля аудита в SaveUpdate, не делая мой объект грязным. Но я не знаю, возможно ли это.

Какие-либо предложения? Я уверен, что кто-то сталкивался с этой проблемой.


person Jon Kruger    schedule 06.10.2009    source источник


Ответы (1)


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

Вам нужен триггер, который вызывается только тогда, когда NH уже объявил объект грязным. Скорее всего, это PreInsert и PreUpdate.

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

Если вы не можете параметризовать валидатор, чтобы пропустить эти значения, вы, вероятно, можете решить эту проблему с помощью этого обходного пути:

  • При SaveUpdate: проверьте, являются ли значения нулевыми, установите его в этом случае, чтобы сделать валидатор счастливым. Они равны нулю только тогда, когда объект является новым экземпляром, тогда он все равно будет сохранен.
  • В PreUpdate и PreInsert: всегда устанавливайте, потому что объект изменился.
person Stefan Steinegger    schedule 06.10.2009
comment
Хорошо, это более или менее идея, которая у меня была. Так что я думаю, что нахожусь на правильном пути. - person Jon Kruger; 06.10.2009