2016-11-09 205 views
1

我想要做的是攔截實體保存並截斷一些字符串屬性。NHibernate攔截器 - 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將傳播到對象,但不一定(立即)傳播到數據庫。強烈建議 攔截器不要修改previousState。

它還說:

當檢測的對象是髒的,齊平的期間調用。

所以我不知道究竟是什麼意思

當檢測到髒的對象調用

而且關於這個文件,更改將被保存到數據庫中,只是沒有必要立即。

無論如何,通過在我的項目中測試這個,這個工作,當OnFlushDirty()被調用,它改變了一些屬性的值,它也保存在數據庫中,所有接縫工作正常。

所以我的問題是:這是正確的嗎?正如我所說,我測試了我的項目,並更改/更新實體OnFlushDirty()被調用,屬性被更改並保存到數據庫中。 僅僅因爲所有這些,和弱的文檔,我不知道我是否可以遇到與此有關的一些問題?

回答

2

我在類似情況下所做的是覆蓋攔截器的FindDirty方法,並返回已更改屬性的索引數組(或者您將在flushdirty中更改)。

在你的情況,你可以重寫該方法,並檢查該方法是否有一些應該被截斷的字符串屬性。如果是這樣,請返回這些屬性的索引。

通過這樣做,您應該確保OnFlushDirty總是在您需要時調用。

除此之外,OnFlushDirty也應該返回true,如果您修改了該方法中的持久性屬性,您不會在我的代碼中看到這一點。

+0

是的,如果我修改了一個持久性屬性,我就返回true,只是我在代碼中犯了錯誤,請檢查現在更新的代碼。 因此,如果我必須修改某些屬性並從'OnFlushDirty'返回'true',並且如果修改了某些屬性,我就會重寫'FindDirty'以返回'true',所以我可以確定'OnFlushDirty'當我需要時調用它,它會更新對象(實體)和數據庫中的屬性? – carpics

+0

只是'FindDirty'返回int int []'的數組,我如何覆蓋它並返回'true' – carpics

+0

我已經更新了我的答案了一下。我不確定你是否可以在FindDirty方法中修改屬性本身...... –