[英]NHibernate Interceptor not working
我设置了一个IIntercpetor
来在实体保存或更新时更新它们的时间戳(最后修改日期)。
我的实现看起来像这样:
public class NhInterceptor : EmptyInterceptor
{
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, NHibernate.Type.IType[] types)
{
var baseEntity = entity as EntityBase;
if (baseEntity == null)
return false;
baseEntity.LastModification = DateTime.Now;
return true;
}
public override bool OnFlushDirty(object entity, object id,
object[] currentState, object[] previousState,
string[] propertyNames, NHibernate.Type.IType[] types)
{
var baseEntity = entity as EntityBase;
if (baseEntity == null)
return false;
baseEntity.LastModification = DateTime.Now;
return true;
}
}
这段代码被点击,调试器显示baseEntity.LastModification
在返回之前具有正确的值。
但是,我的Json输出(在Web API中)显示LastModification
为0001-01-01T00:00:00
,如果我检查数据库中创建的实体,它也会显示相同的结果。
为什么这不起作用?
您需要更改currentState值。 首先在propertyNames中查找“ LastModification”,然后更改索引的currentState(如果找到)。 您也可以在IType []中检查类型。
我决定根据Hylaean的回答为您提供我的工作解决方案。
我的拦截器课程:
public class NhInterceptor : EmptyInterceptor
{
public override bool OnSave(object entity, object id, object[] state,
string[] propertyNames, NHibernate.Type.IType[] types)
{
var baseEntity = entity as EntityBase;
if (baseEntity == null)
return false;
var lastModificationPropName = ExpressionUtil
.GetPropertyName<EntityBase>((e) => e.LastModification);
for (int i = 0; i < propertyNames.Length; i++)
{
if (lastModificationPropName == propertyNames[i])
{
state[i] = DateTime.Now;
return true;
}
}
return true;
}
public override bool OnFlushDirty(object entity, object id,
object[] currentState, object[] previousState,
string[] propertyNames, NHibernate.Type.IType[] types)
{
var baseEntity = entity as EntityBase;
if (baseEntity == null)
return false;
var lastModificationPropName = ExpressionUtil
.GetPropertyName<EntityBase>((e) => e.LastModification);
for (int i = 0; i < propertyNames.Length; i++)
{
if (lastModificationPropName == propertyNames[i])
{
currentState[i] = DateTime.Now;
return true;
}
}
return true;
}
}
我的Expression util类:
public static class ExpressionUtil
{
public static string GetPropertyName<T>(Expression<Func<T, object>> expression)
{
var body = expression.Body as MemberExpression;
if (body == null)
{
body = ((UnaryExpression)expression.Body).Operand as MemberExpression;
}
return body.Member.Name;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.