我想要做的是攔截實體保存並截斷一些字符串屬性。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()
被調用,屬性被更改並保存到數據庫中。 僅僅因爲所有這些,和弱的文檔,我不知道我是否可以遇到與此有關的一些問題?
是的,如果我修改了一個持久性屬性,我就返回true,只是我在代碼中犯了錯誤,請檢查現在更新的代碼。 因此,如果我必須修改某些屬性並從'OnFlushDirty'返回'true',並且如果修改了某些屬性,我就會重寫'FindDirty'以返回'true',所以我可以確定'OnFlushDirty'當我需要時調用它,它會更新對象(實體)和數據庫中的屬性? – carpics
只是'FindDirty'返回int int []'的數組,我如何覆蓋它並返回'true' – carpics
我已經更新了我的答案了一下。我不確定你是否可以在FindDirty方法中修改屬性本身...... –