IPreUpdateEventListener и dynamic-update = "true" - PullRequest
10 голосов
/ 23 февраля 2011

Я пытался создать очень простой сценарий аудита, следующий за блогом Айенде , который, кажется, является ресурсом, на который все ссылаются, когда дело доходит до IPreUpdateEventListener и IPreInsertEventListener.

Однако неважнокак я старался, я не мог заставить его работать.Событие сработало правильно, все выглядело нормально, когда я прошел через него, но в базу данных не было выпущено ни одного обновления моего «измененного времени».

Я потратил около одного дня на поиски в Google и наконец нашел ответ здесь.

Это просто не будет работать, если ваша сущность сопоставлена ​​с dynamic-update = "true".И конечно же, это был случай для меня.Поскольку мне было так сложно найти эту информацию, редко ли используется dynamic-update = "true"?Мы используем его на всех наших объектах.

Поскольку для нас это главный удар по дороге, я хотел спросить, есть ли вообще способ обойти это?

Я смотрю на IInterceptorно это всегда упоминается как устаревшее, так в чем недостатки этого?Также мне не удалось найти действительно хороший учебник о том, как архивировать тот же аудит (с метками времени вставки / обновления) с помощью IInterceptor (я довольно новичок в NHibernate).

Любая помощь будет принята с благодарностью!

Ответы [ 2 ]

10 голосов
/ 23 февраля 2011

Я столкнулся с этой проблемой. Вот как я это исправил:

public class MyFlushEntityEventListener : DefaultFlushEntityEventListener
{
    protected override void DirtyCheck(FlushEntityEvent e)
    {
        base.DirtyCheck(e);
        if (e.DirtyProperties != null &&
            e.DirtyProperties.Any() &&
            //ITrackUpdate is my inteface for audited entities
            e.Entity is ITrackUpdate)
            e.DirtyProperties = e.DirtyProperties
             .Concat(GetAdditionalDirtyProperties(e)).ToArray();
    }

    static IEnumerable<int> GetAdditionalDirtyProperties(FlushEntityEvent @event)
    {
        yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames, 
                                   "UpdateTime");
        yield return Array.IndexOf(@event.EntityEntry.Persister.PropertyNames, 
                                   "UpdateUser");
        //You can add any additional properties here.
        //Some of my entities do not track the user, for example.
    }
}

Затем просто замените прослушиватель событий в файле конфигурации NH:

<listener type="flush-entity"
          class="MyFlushEntityEventListener, MyAssembly"/>
1 голос
/ 09 сентября 2011

У меня была такая же проблема, однако я нашел, что могу обойти ее, используя OnFlushDirty.

. Мое решение можно найти здесь.

...