Я реализовал слушателей для аудита изменений в таблицах в моем приложении, используя IPreUpdateEventListener
и IPreInsertEventListener
, и все работает, за исключением моих отношений «многие ко многим», которые не имеют дополнительных данных в объединяемой таблице (т.е. у меня нет POCO для соединительный стол).
Каждый проверяемый объект реализует интерфейс IAuditable
, поэтому прослушиватель событий проверяет, имеет ли POCO тип IAuditable
, и если это так, он записывает любые изменения объекта. Таблицы поиска реализуют IAuditableProperty
интерфейс, поэтому, если свойство IAuditable
POCO указывает на таблицу поиска, изменения записываются в журнал для основного POCO.
Итак, вопрос в том, как мне определить, что я работаю с коллекцией «многие ко многим», и записать изменения в свою таблицу аудита?
Изменить: я использую NHibernate 2.1.2.4000
//first two checks for LastUpdated and LastUpdatedBy ommitted for brevity
else if (newState[i] is IAuditable)
{
//Do nothing, these will record themselves separately
}
else if (!(newState[i] is IAuditableProperty) && (newState[i] is IList<object> || newState[i] is ISet))
{
//Do nothing, this is a collection and individual items will update themselves if they are auditable
//I believe this is where my many-to-many values are being lost
}
else if (!isUpdateEvent || !Equals(oldState[i], newState[i]))//Record only modified fields when updating
{
changes.Append(preDatabaseEvent.Persister.PropertyNames[i])
.Append(": ");
if (newState[i] is IAuditableProperty)
{
//Record changes to values in lookup tables
if (isUpdateEvent)
{
changes.Append(((IAuditableProperty)oldState[i]).AuditPropertyValue)
.Append(" => ");
}
changes.Append(((IAuditableProperty)newState[i]).AuditPropertyValue);
}
else
{
//Record changes for primitive values
if(isUpdateEvent)
{
changes.Append(oldState[i])
.Append(" => ");
}
changes.Append(newState[i]);
}
changes.AppendLine();
}
OnPreUpdate
иOnPreInsert
даже не срабатывают, когда я изменяю коллекции "многие ко многим", но изменения сохраняются в базе данных. Это, вероятно, ожидаемое поведение из-за некоторой более глубокой магии NHibernate, но это похоже на ошибку / упущение для немытых масс ... - person Kendrick   schedule 24.12.2010