2016-11-09 14 views
1

Что я хочу сделать, это перехватить объект для сохранения и обрезать некоторые свойства строки.NHibernate Interceptor - OnFlushDirty

Проблема заключается в том, что OnSave() запускается только для новых Entity, но не при изменении/обновлении Entity.

Затем есть перехватчик OnFlushDirty(). Но я действительно смущен этим.

Так что я хочу изменить некоторые свойства объекта по обновлению сущности, как:

public bool OnFlushDirty( 
      object entity, 
      object id, 
      object[] currentState, 
      object[] previousState, 
      string[] propertyNames, 
      IType[] types) 
{ 
     bool entityChanged = false; 
     for (int i = 0; i < propertyNames.Length; i++) 
     { 
      var stringType = types[i] as NHibernate.Type.StringType; 

      if (stringType != null) 
      { 
       if(NeedTruncate(currentState[i])) 
       { 
         currentState[i] = Truncate(currentState[i]); 
         entityChanged = true; 
       } 
      } 
     } 

     return entityChanged; 
} 

Так вопрос в следующем. В некоторых блогах, таких как this one, я читал, что OnFlushDirty() вызывается, когда сущность была изменена и сохранена в базе данных, поэтому изменения любого свойства здесь не будут сохранены в базе данных.

Но в githab.io документации говорится:

Перехватчик может изменить обнаруженный CurrentState, который будет распространяющийся как к базе данных и хранимый объект. Обратите внимание, что все флеши заканчиваются фактической синхронизацией с базой данных, в , которая, поскольку новый currentState будет передан объекту, но не обязательно (сразу) в базу данных. Настоятельно рекомендуется , чтобы перехватчик не изменял предыдущее состояние.

Он также говорит:

Вызывается, когда объект обнаружен быть грязным, во флеш.

Так что я не уверен, что именно означает

Вызывается, когда объект обнаружен быть грязным

Также в отношении к этой документации, изменения будут сохранены в базе данных, просто не обязательно сразу.

В любом случае, тестируя это в моем проекте, это работает, и когда вызывается OnFlushDirty(), и он изменяет значение некоторого свойства, он также сохраняется в базе данных, и все швы работают нормально.

Итак, мой вопрос: правильно ли это делать? Как я уже сказал, я тестировал его с моим проектом, а также при изменении/обновлении объекта OnFlushDirty(), свойство было изменено и сохранено в базе данных. Просто потому, что все это и слабая документация, я не уверен, могу ли я столкнуться с некоторыми проблемами с этим?

ответ

2

Что я делаю в аналогичном случае, переопределяет метод перехватчика FindDirty и возвращает массив индексов для свойств, которые имеют изменения (или которые вы измените в flushdirty).

В вашем случае вы можете переопределить этот метод и проверить этот метод независимо от того, у вас есть некоторые строковые свойства, которые должны быть усечены. Если это так, верните индексы этих свойств.

Таким образом, вы должны быть уверены, что OnFlushDirty всегда вызывается, когда вам это необходимо.

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

+0

Да, я возвращаю true, если я изменил постоянное свойство, только я сделал ошибку с кодом, о котором идет речь, пожалуйста, проверьте обновленный код. Итак, как только я переопределяю 'FindDirty', чтобы возвращать' true', если мне нужно изменить некоторое свойство, а также вернуть 'true' из' OnFlushDirty', если я изменил какое-то свойство, я могу быть уверен, что 'OnFlushDirty' будет всегда когда он мне нужен, и что он будет обновлять свойство в объекте (Entity) и в базе данных? – carpics

+0

Только 'FindDirty' возвращает и массив int' int [] ', как я могу переопределить его и вернуть' true' – carpics

+0

Я немного обновил свой ответ. Я не уверен, можете ли вы сами изменить свойство в методе FindDirty .... –