2009-09-29 95 views
0

我为我的域模型中的ILoggable对象设置了一个IInterceptor。而在OnFlushDirty事件上,我正在尝试保存日志(审计)。但是在做这件事时,我的代码进入了一个无限循环。在NHibernate中保存对象IInterceptor

_logrepository.Save(日志)调用OnFlushDirty即使日志不是ILoggable对象(这是因为实体仍然是以前的对象)

是否有使用.Save(无需打开另一个会话)的方式在IInterceptor,或者我如何在IInterceptor中的数据库中插入日志?


public override bool OnFlushDirty(object entity, object id, object[] currentState, object[] previousState, string[] propertyNames, NHibernate.Type.IType[] types) 
    { 
     //find diffs, log each change 
     if (entity is ILoggable && entity is NamedEntity) 
     { 
     var namedEntity = entity as NamedEntity; 
     for (var i = 0; i < currentState.Count(); i++) 
     { 
      if (currentState[i] != previousState[i]) 
      { 
      var log = new Log() 
         { 
          Description = "update", 
          InDate = namedEntity.ModifiedDate.Value, 
          ItemId = namedEntity.Id, 
          ItemType = namedEntity.GetType().Name, 
          NewValue = currentState[i].ToString(), 
          OldValue = previousState[i].ToString(), 
          PropertyName = propertyNames[i], 
          UserId = namedEntity.ModifiedByUserId.Value 
         }; 

      // calling save calls onflushdirty again, where entity is not log, but the same entity of the first call 
      ObjectFactory.GetInstance().Save(log); 
      } 
     } 
     } 
     return base.OnFlushDirty(entity, id, currentState, previousState, propertyNames, types); 
    } 

回答

0

好吧,我想通了,我的问题是_logrepository.Save(日志)打开另一个事务并提交它。 因此,我更改logrepository.Save(日志)不打开并提交另一个事务,但使用一个打开的事务。