I'm using Ayende's method (http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx) to set the create and update date on entities with Listeners, but it's only setting them for the entity being affected, not anything else in the unit of work.
So, for example, if I do this:
Order order = repository.Get<Order>(1);
order.AddNote(new Note("this is a note"));
repository.SaveOrUpdate(order);
The Note gets a create/update date, but the order does not. Are there any tricks to getting the entire unit of work to show an update? Or do I physically have to update a property on the order to get that update date set?
If it make any difference, I'm also using S#arp Architecture.
Here's the code block I'm using:
public class AuditEventListener : IPreUpdateEventListener, IPreInsertEventListener
{
public bool OnPreUpdate(PreUpdateEvent @event)
{
var audit = @event.Entity as AuditedEntity;
if (audit == null)
return false;
var time = DateTime.Now;
Set(@event.Persister, @event.State, "UpdateDate", time);
audit.UpdateDate = time;
return false;
}
public bool OnPreInsert(PreInsertEvent @event)
{
var audit = @event.Entity as AuditedEntity;
if (audit == null)
return false;
var time = DateTime.Now;
Set(@event.Persister, @event.State, "CreateDate", time);
Set(@event.Persister, @event.State, "UpdatedDate", time);
audit.CreateDate= time;
audit.UpdateDate= time;
return false;
}
private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
{
var index = Array.IndexOf(persister.PropertyNames, propertyName);
if (index == -1)
return;
state[index] = value;
}
}