Аудит для игнорирования некоторых изменений свойств с помощью прослушивателей событий NHibernate - PullRequest
1 голос
/ 15 октября 2010

Я подключил регистрацию в моем приложении, чтобы автоматически регистрировать изменения в определенных объектах, используя прослушиватели событий.Это прекрасно работает, но для некоторых свойств внутри сущностей, которые я регистрирую, я не хочу вставлять журнал, если в это свойство вносится только изменение.Эти свойства украшены атрибутом IgnoreLoggingAttribute.Вот что у меня есть:

public void OnPostUpdate(PostUpdateEvent @event)
{
    var session = @event.Session.GetSession(NHibernate.EntityMode.Poco);

    if (@event.Entity is User)
        session.SaveOrUpdate(new UserLog((User)@event.Entity));
    ...
}

@event предоставляет 2 свойства, которые называются State и OldState.Я могу использовать это для проверки изменений, однако я не могу вытащить интересующие меня свойства, так как это просто массивы объектов.Я подумал, что мог бы использовать некоторое отражение, чтобы получить все индексы (для любых свойств с IgnoreLoggingAttribute) и сопоставить их с теми, что в массиве объектов.До сих пор я придумал:

var properties = typeof(User).GetProperties().Where(p => p.GetCustomAttributes(typeof(IgnoreLoggingAttribute), false).Count() > 0);

Проблема сейчас в том, что она не дает мне индекс свойства по отношению к исходной сущности.Мне также нужно убедиться, что это соответствует соответствующему индексу из свойств @ event.State и @ event.OldState (которые, похоже, игнорируют определенные свойства).

Ответы [ 2 ]

3 голосов
/ 08 ноября 2010

Мне удалось добиться этого, вызвав этот метод перед вставкой в ​​таблицу журнала:

private bool IsDirty(PostUpdateEvent @event) {
    // Get all the mapped property names
    var propertyNames = @event.Session.Factory.GetClassMetadata(@event.Entity.GetType()).PropertyNames;

    // Get the property index to ignore
    var propertyIndexesToIgnore = @event.Entity.GetType().GetProperties()
        .Where(p => p.GetCustomAttributes(typeof(IgnoreLoggingAttribute), false).Count() > 0)
        .Select(p => Array.IndexOf(propertyNames, p.Name)).ToArray();

    if (@event.OldState != null && @event.State != null) {
        for (var i = 0; i < @event.OldState.Length; i++) {
            if (!propertyIndexesToIgnore.Contains(i) && !@event.OldState[i].Equals(@event.State[i]))
                return true;
        }
    }

    return false;
}

Теперь все, что мне нужно сделать, это применить атрибут IgnoreLoggingAttribute к любым свойствам, которые я не хочу регистрировать. Надеюсь, это поможет.

0 голосов
/ 29 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...