NHibernate拦截器 - OnFlushDirty

时间:2016-11-09 14:09:11

标签: c# nhibernate fluent-nhibernate interceptor

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

问题是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()时,属性也被更改并保存到数据库中。 仅仅因为所有这些以及弱文档,我不确定我是否会遇到一些问题?

1 个答案:

答案 0 :(得分:2)

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

在您的情况下,您可以覆盖该方法并检查该方法是否有一些应该被截断的字符串属性。如果是,请返回这些属性的索引。

通过这样做,您应该确保在您需要时始终调用OnFlushDirty

除此之外,如果你修改了该方法中的持久属性,OnFlushDirty也应该返回true,你在我这里发布的代码中没有看到这一点。