NHibernate Interceptor - OnFlushDirty

本文关键字:OnFlushDirty Interceptor NHibernate | 更新日期: 2023-09-27 18:17:11

我想做的是在保存时拦截实体并截断一些字符串属性。

问题是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;
}

所以问题是下一个。在像这样的一些博客上,我读到OnFlushDirty()在实体被改变并保存到数据库时被调用,所以这里对任何属性的改变都不会被保存到数据库中。

但是在githab中。IO文档说:

拦截器可能会修改检测到的currentState,这将是传播到数据库和持久对象。请注意,所有刷新都在与数据库的实际同步中结束作为新的currentState将被传播到对象,但是不一定(立即)到数据库。它是强烈的建议拦截器不要修改previousState。

它还说:

在刷新期间检测到对象为脏时调用。

所以我不确定

到底是什么意思

当一个对象被检测为脏时调用

同样关于本文档,更改将被保存到数据库中,只是不需要立即。

无论如何,通过在我的项目中测试,这是有效的,当OnFlushDirty()被调用时,它改变了一些属性的值,它也保存在数据库中,所有接缝都工作得很好。

所以我的问题是:这样做正确吗?正如我所说,我用我的项目测试了它,并在更改/更新实体OnFlushDirty()时被调用,属性也被更改并保存到数据库中。只是因为所有这些,以及薄弱的文档,我不确定我是否会遇到一些问题。

NHibernate Interceptor - OnFlushDirty

在类似的情况下,我所做的是覆盖拦截器的FindDirty方法,并返回有更改的属性的索引数组(或者您将在flushdirty中更改)。

在你的例子中,你可以重写那个方法并在那个方法中检查你是否有一些应该被截断的字符串属性。如果是,则返回这些属性的索引。

这样做,你应该确保OnFlushDirty总是在你需要的时候被调用。

接下来,OnFlushDirty也应该返回true,如果你已经修改了一个持久的属性在该方法中,你不做,我可以看到在你的代码,张贴在这里。