NHibernate 拦截器 - OnFlushDirty

NHibernate Interceptor - OnFlushDirty

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

问题是 OnSave() 仅针对新的 Entity 触发,而不是 changing/updating 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 文档中它说:

The interceptor may modify the detected currentState, which will be propagated to both the database and the persistent object. Note that all flushes end in an actual synchronization with the database, in which as the new currentState will be propagated to the object, but not necessarily (immediately) to the database. It is strongly recommended that the interceptor not modify the previousState.

它还说:

Called when an object is detected to be dirty, during a flush.

所以我不确定到底是什么意思

Called when an object is detected to be dirty

另外关于此文档,更改将保存到数据库中,只是不需要立即保存。

无论如何,通过在我的项目中测试它,它可以工作,当 OnFlushDirty() 被调用时它会改变一些 属性 的值,它也被保存在数据库中并且所有接缝都可以正常工作。

所以我的问题是:这样做正确吗?正如我所说,我用我的项目测试了它,在 changing/updating 实体 OnFlushDirty() 被调用,属性 被更改并保存到数据库中。 仅仅因为所有这些以及薄弱的文档,我不确定我是否可以 运行 解决这个问题?

在类似的情况下,我所做的是重写拦截器的 FindDirty 方法,以及 return 已更改属性的索引数组(或者您将更改的属性) flushdirty)。

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

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

此外,如果您在该方法中修改了持久性 属性,OnFlushDirty 也应该 return 为真,据我在您的此处发布的代码。