NHibernate 提供了很多扩展的地方。其中有 Session IInterceptor
。有很多细节的文档:
http://nhibernate.info/doc/nh/en/index.html#objectstate-interceptors
在这种情况下,我们可以创建自定义的,它将观察我们的实体(例如Client)和每次都必须更新的属性(例如Code)。所以我们的实现可能如下所示:
public class MyInterceptor : EmptyInterceptor
{
public override int[] FindDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types)
{
var result = new List<int>();
// we do not care about other entities here
if(!(entity is Client))
{
return null;
}
var length = propertyNames.Length;
// iterate all properties
for(var i = 0; i < length; i++)
{
var areEqual = currentState[i].Equals(previousState[i]);
var isResettingProperty = propertyNames[i] == "Code";
if (!areEqual || isResettingProperty)
{
result.Add(i); // the index of "Code" property will be added always
}
}
return result.ToArray();
}
}
注意:这只是一个例子!应用您自己的逻辑来检查脏属性。
我们必须这样包装Session
:
var interceptor = new MyInterceptor()
_configuration.SetInterceptor(interceptor);
就是这样。当客户端被标记为动态更新时,属性代码将始终设置为脏
<class name="Client" dynamic-update="true" ...