以下代码在插入时可以正常工作,但在更新时
预更新代码正在运行,并正确地将状态和实体值设置为所需的值。然而,在查看生成的SQL时,nhibernate没有将该字段包含在更新查询中。
modifier
从未被设置,有任何想法吗?预更新代码正在运行,并正确地将状态和实体值设置为所需的值。然而,在查看生成的SQL时,nhibernate没有将该字段包含在更新查询中。
/// <summary> Updates auditable objects </summary>
public class AuditEventListener : IPreInsertEventListener, IPreUpdateEventListener
{
private ISecurityManager securityManager;
public bool OnPreInsert( PreInsertEvent args )
{
var auditable = args.Entity as IAuditable;
if (auditable != null) {
Set( x => auditable.Creator, args.Persister, auditable, args.State, SecurityManager.Identity );
Set( x => auditable.DateAdded, args.Persister, auditable, args.State, Clock.Now );
}
return false;
}
public bool OnPreUpdate( PreUpdateEvent args )
{
var auditable = args.Entity as IAuditable;
if (auditable != null) {
Set( x => auditable.Modifier, args.Persister, auditable, args.State, SecurityManager.Identity );
//Set( x => auditable.DateModified, args.Persister, auditable, args.State, Clock.Now );
}
return false;
}
/// <summary> Type safe method to update sate and entity </summary>
private void Set<T, U>( Expression<Func<U, T>> expression, IEntityPersister persister, U instance, object[] state, T value )
{
var member = expression.Body as MemberExpression;
if (member != null) {
var index = Array.IndexOf( persister.PropertyNames, member.Member.Name );
if (index == -1) {
return;
}
state[index] = value;
var property = (member.Member as PropertyInfo);
if (property != null) {
property.SetValue( instance, value, null );
}
}
}
ISecurityManager SecurityManager
{
get { /* From IoC */ }
}
}