简体   繁体   English

在NHibernate IInterceptor中保存对象

[英]saving objects in NHibernate IInterceptor

I set up an IInterceptor for ILoggable objects in my domain model. 我在域模型中为ILoggable对象设置了一个IInterceptor。 And on OnFlushDirty event, i am trying to save a log (audit). 在OnFlushDirty事件上,我正在尝试保存日志(审核)。 But while doing this, my code goes into an infinite loop. 但是在执行此操作时,我的代码进入了无限循环。

_logrepository.Save(log) calls OnFlushDirty even if log is not an ILoggable object (it is because entity is still the previous object) _logrepository.Save(log)调用OnFlushDirty,即使log不是ILoggable对象(这是因为实体仍然是前一个对象)

Is there a way to use .Save (without opening another session) in IInterceptor, or how do I insert a log into database in IInterceptor? 有没有一种方法可以在IInterceptor中使用.Save(无需打开另一个会话),或者如何在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);
    }

ok, i figured it out, my problem was _logrepository.Save(log) was opening ANOTHER transaction and commiting it. 好的,我知道了,我的问题是_logrepository.Save(log)正在打开另一个交易并提交它。 So, i changed logrepository.Save(log) not to open and commit another transaction but use an open transaction. 因此,我更改了logrepository.Save(log)而不是打开并提交另一个事务,而是使用一个打开的事务。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM