Mam zaimplementowane detektory do audytu zmian w tabelach w mojej aplikacji przy użyciu IPreUpdateEventListener
i IPreInsertEventListener
i wszystko działa z wyjątkiem relacji wiele do wielu, które nie mają dodatkowych danych w łączeniu tabela (tj. nie mam POCO dla tabeli łączenia).Audit relacji wiele do wielu w NHibernate
Każdy auditowalny obiekt implementuje interfejs IAuditable
, więc detektor zdarzeń sprawdza, czy POCO jest typu IAuditable
, i czy jest to rejestracja jakichkolwiek zmian w obiekcie. Tabele wyszukiwania implementują inteface IAuditableProperty
, więc jeśli właściwość IAuditable
POCO wskazuje na tabelę odnośników, zmiany są rejestrowane w dzienniku głównego POCO.
Pytanie brzmi: w jaki sposób określić, czy pracuję z kolekcją wielu do wielu i rejestrować zmiany w mojej tabeli kontroli?
Edycja: używam 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();
}
Kopiowanie do tego, wygląda na to, że moje zdarzenia 'OnPreUpdate' i' OnPreInsert' nawet nie uruchamiają się, gdy modyfikuję zbiory wielu do wielu, ale zmiany są zachowywane w bazie danych. Jest to prawdopodobnie oczekiwane zachowanie ze względu na nieco głębszą magię NHibernate, ale wydaje się, że to błąd/rządy dla nieumytych mas ... – Kendrick