Я думаю, что лучшим решением является использование прослушивателей событий:
http://darrell.mozingo.net/2009/08/31/auditing-with-nhibernate-listeners/
Я написал нечто похожее на выше (измененное после нахождения этого блога), за исключением того, что я сохранил результат в XML.
например:
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);
}
Служба аудита просто строит и добавляет некоторые дополнительные данные, такие как IP-адрес, Пользователь (если есть), обновление системы / службы или действия через веб-сайт или пользователя и т. Д.
Затем в моей БД я храню XML как:
<AuditedData>
<Item Property="Awesomeness">
<OldValue>above average</OldValue>
<NewValue>godly</NewValue>
</Item>
<Item Property="Name">
<OldValue>Phill</OldValue>
<NewValue>Phillip</NewValue>
</Item>
</AuditedData>
У меня также есть слушатели Вставить / Удалить.