Обычная вещь, которую многие люди делают с 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, не делая мой объект грязным. Но я не знаю, возможно ли это.
Какие-либо предложения? Я уверен, что кто-то сталкивался с этой проблемой.