I think the best solution is to listen to the listeners:
http://darrell.mozingo.net/2009/08/31/auditing-with-nhibernate-listeners/
I wrote something similar above (modified after discovering this blog), except that I save the result in XML.
eg:
public void OnPostUpdate(PostUpdateEvent updateEvent) { if (updateEvent.Entity is AuditItem) return; var dirtyFieldIndexes = updateEvent.Persister.FindDirty(updateEvent.State, updateEvent.OldState, updateEvent.Entity, updateEvent.Session); var data = new XElement("AuditedData"); foreach (var dirtyFieldIndex in dirtyFieldIndexes) { var oldValue = GetStringValueFromStateArray(updateEvent.OldState, dirtyFieldIndex); var newValue = GetStringValueFromStateArray(updateEvent.State, dirtyFieldIndex); if (oldValue == newValue) { continue; } data.Add(new XElement("Item", new XAttribute("Property", updateEvent.Persister.PropertyNames[dirtyFieldIndex]), new XElement("OldValue", oldValue), new XElement("NewValue", newValue) )); } AuditService.Record(data, updateEvent.Entity, AuditType.Update); }
The audit service simply creates additional additional data, such as the IP address, User (if any), whether it was an update of the system or service, or was performed through a website or user, etc.
Then in my DB I Store XML as:
<AuditedData> <Item Property="Awesomeness"> <OldValue>above average</OldValue> <NewValue>godly</NewValue> </Item> <Item Property="Name"> <OldValue>Phill</OldValue> <NewValue>Phillip</NewValue> </Item> </AuditedData>
I also have Insert / Delete listeners.
Phill
source share