代码之家  ›  专栏  ›  技术社区  ›  Daniel Little

nhibernate审计与更新事件

  •  5
  • Daniel Little  · 技术社区  · 14 年前

    以下代码适用于insert,但适用于update 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 */ }
        }
    
    }
    
    1 回复  |  直到 13 年前
        1
  •  3
  •   Community CDub    7 年前

    编辑一:这个答案已经改进了
    动态更新 设置为true为 found here

    当您在前面调用的OnFlushDirty函数中更新更改时,这些更改将被保存。

    public override bool OnFlushDirty( object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types )
    {
        bool result = false;
    
        if (entity is IAuditable) {
            var auditable = (IAuditable)entity;
    
            Set( x => auditable.Modifier, propertyNames, auditable, currentState, SecurityManager.Identity );
            //Set( x => auditable.DateModified, args.Persister, auditable, args.State, TwentyClock.Now );
    
            result = true;
        }
    
        return result;
    }