2012-08-25 3 views
0

У меня есть проект с использованием NHibernate 3. Я использовал Auditor Event Listener в NHibernate для обрезания свойств строки в моих сущностях.Неверный вызов `OnPreUpdate` в Auditor Реализация прослушивателя событий в NHibernate

Мой код:

public class AuditorEventListener : IPreInsertEventListener, IPreUpdateEventListener 
{ 
    public bool OnPreInsert(PreInsertEvent preInsertEvent) 
    { 
     Correction(preInsertEvent.Entity); 
     return false; 
    } 

    public bool OnPreUpdate(PreUpdateEvent preUpdateEvent) 
    { 
     Correction(preUpdateEvent.Entity); 
     return false; 
    } 

    internal static void Correction(object entity) 
    { 
     var properties = entity.GetType().GetProperties().Where(p => p.PropertyType == typeof(String)); 

     foreach (var item in properties) 
     { 
      var result = item.GetValue(entity, null).ToString(); 
      result = result.Trim(); 
      item.SetValue(entity, result, null); 
     } 
    } 
} 

NHibernate конфигурации является:

<event type="pre-insert"> 
    <listener class="NS.NHibernate.AuditorEventListener, NS.NHibernate" /> 
</event> 
<event type="pre-update"> 
    <listener class="NS.NHibernate.AuditorEventListener, NS.NHibernate" /> 
</event> 

Я использовал ниже команды для сохранения и обновления для юридических лиц:

SessionInstance.Save(item); 
SessionInstance.Update(item); 

Моя проблема заключается в экономии лица , Когда я вызываю метод save, вызывается метод OnPreInsert. Когда я вызываю CommitTransaction() OnPreUpdate, вызывается автоматически.

Также я использовал Concurrency в NHibernate, и это автоматически OnPreUpdate вызов вызвал к стоимости Version собственности в базе данных будет 2 вместо 1 до сих пор не проблемы но для следующего обновления этой ошибки объекта параллелизма будет происходить, потому что значение версии в этот объект равен 1, но значение версии в базе данных - 2.

Почему OnPreUpdate называется?

ответ

0

Я не знаю, помогает ли это, но в любом случае всякий раз, когда вы что-то обновляете в сущности, вы также должны обновлять его в preInsertEvent.State/preUpdateEvent.State. Для получения дополнительной информации смотрите этот пост http://ayende.com/blog/3987/nhibernate-ipreupdateeventlistener-ipreinserteventlistener Надеюсь, что это поможет

0

Почему называется OnPreUpdate?

Похоже, ваш «session.FlushMode» установлен в «FlushMode.Auto» или «FlushMode.Commit» Вы можете использовать «FlushMode.Never», но вы должны явно вызвать «session.Flush()»

Вы видели возможность использовать перехватчик, он выглядит более мощным, чем EventListener

+0

Моя настройка «FlushMode» находится в режиме «Авто», и мне нужен этот режим. Я не могу установить его в режиме «Никогда», потому что логика моего проекта не позволяла мне это делать. – Ehsan