Ich verwende die Methode von Ayende ( http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx ), um das Erstellungs- und Aktualisierungsdatum für Entitäten mit Listenern zu setzen, aber es setzt sie nur für die betroffene Entität, nicht für irgendetwas anderes in der Unit of Work.
Wenn ich also zum Beispiel dies tue:
Order order = repository.Get<Order>(1);
order.AddNote(new Note("this is a note"));
repository.SaveOrUpdate(order);
Die Notiz erhält ein Erstellungs-/Aktualisierungsdatum, der Auftrag jedoch nicht. Gibt es irgendwelche Tricks, damit die gesamte Arbeitseinheit eine Aktualisierung anzeigt? Oder muss ich eine Eigenschaft der Bestellung aktualisieren, damit das Aktualisierungsdatum gesetzt wird?
Falls es einen Unterschied macht, ich benutze auch S#arp Architecture.
Hier ist der Codeblock, den ich verwende:
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;
}
}