Session NHibernate IPreUpdateEventListener不';t插入第二个表

Session NHibernate IPreUpdateEventListener不';t插入第二个表,session,nhibernate,fluent-nhibernate,audit-logging,ipreupdateeventlistener,Session,Nhibernate,Fluent Nhibernate,Audit Logging,Ipreupdateeventlistener,我正在原型化一些简单的审计日志功能。我有一个中型实体模型(~50个实体),我想在大约5或6个实体上实现审计日志记录。最终,我希望在插入和删除上也能做到这一点,但现在我只关注更新 问题是,当我从EventListener中执行session.Save(或SaveOrUpdate)到我的auditLog表时,原始对象被正确地持久化(更新),但我的auditLog对象从未被插入 我认为在NHibernate save生命周期的后期调用Pre和Post事件侦听器是一个问题,因为会话仍在使用 //in m

我正在原型化一些简单的审计日志功能。我有一个中型实体模型(~50个实体),我想在大约5或6个实体上实现审计日志记录。最终,我希望在插入和删除上也能做到这一点,但现在我只关注更新

问题是,当我从EventListener中执行session.Save(或SaveOrUpdate)到我的auditLog表时,原始对象被正确地持久化(更新),但我的auditLog对象从未被插入

我认为在NHibernate save生命周期的后期调用
Pre
Post
事件侦听器是一个问题,因为会话仍在使用

//in my ISessionFactory Build method

nHibernateConfiguration.EventListeners.PreUpdateEventListeners = 
    new IPreUpdateEventListener[]{new AuditLogListener()};


//in my AuditLogListener
public class AuditLogListener : IPreUpdateEventListener
{
    public bool OnPreUpdate(PreUpdateEvent @event)
    {
        string message = //code to look at @event.Entity & build message - this works            
        if (!string.IsNullOrEmpty(message))
            AuditLogHelper.Log(message, @event.Session); //Session is an IEventSource

        return false; //Don't veto the change
    }
}

//In my helper
public static void Log(string message, IEventSource session)
{
    var user = session.QueryOver<User>()
                      .Where(x => x.Name == "John")
                      .SingleOrDefault();
    //have confirmed a valid user is found

    var logItem = new AdministrationAuditLog
                  {
                     LogDate = DateTime.Now,
                     Message = message,
                     User = user
                  };

    (session as ISession).SaveOrUpdate(logItem);
}

数据库中的“我的日志”表中仍然没有显示任何内容。没有错误或异常。

您需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在日志方法中使用它。根据flushmode设置,您可能还需要刷新子会话


另外,您有什么特别的原因想推出自己的解决方案吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。

您需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在日志方法中使用它。根据flushmode设置,您可能还需要刷新子会话


另外,您有什么特别的原因想推出自己的解决方案吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。

您需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在日志方法中使用它。根据flushmode设置,您可能还需要刷新子会话


另外,您有什么特别的原因想推出自己的解决方案吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。

您需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在日志方法中使用它。根据flushmode设置,您可能还需要刷新子会话


另外,您有什么特别的原因想推出自己的解决方案吗?仅供参考,NHibernate Envers现在是一个非常成熟的库。

您需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在日志方法中使用它。另外,您有什么特别的原因想推出自己的解决方案吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。我刚刚尝试过。。。请参见编辑问题(现在猜测),根据flushmode设置,您可能还需要刷新子会话。超级明星!:-)子会话上缺少一个
.Flush()
。为此干杯。至于Envers项目。我甚至不知道它的存在。我也会去解决的。谢谢,罗杰。如果你想在回答中坚持你的2条建议,我会给你一个复选标记,你需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在log方法中使用它。另外,你想推出自己的解决方案有什么特别的原因吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。我刚刚尝试过。。。请参见编辑问题(现在猜测),根据flushmode设置,您可能还需要刷新子会话。超级明星!:-)子会话上缺少一个
.Flush()
。为此干杯。至于Envers项目。我甚至不知道它的存在。我也会去解决的。谢谢,罗杰。如果你想在回答中坚持你的2条建议,我会给你一个复选标记,你需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在log方法中使用它。另外,你想推出自己的解决方案有什么特别的原因吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。我刚刚尝试过。。。请参见编辑问题(现在猜测),根据flushmode设置,您可能还需要刷新子会话。超级明星!:-)子会话上缺少一个
.Flush()
。为此干杯。至于Envers项目。我甚至不知道它的存在。我也会去解决的。谢谢,罗杰。如果你想在回答中坚持你的2条建议,我会给你一个复选标记,你需要在OnPreUpdate方法中创建一个子会话currentSession.GetSession(EntityMode.Poco),并在log方法中使用它。另外,你想推出自己的解决方案有什么特别的原因吗?仅供参考,NHibernate Envers现在是一个相当成熟的库。我刚刚尝试过。。。请参见编辑问题(现在猜测),根据flushmode设置,您可能还需要刷新子会话。超级明星!:-)子会话上缺少一个
.Flush()
。为此干杯。至于Envers项目。我甚至不知道它的存在。我也会去解决的。谢谢,罗杰。如果你想在回答中坚持你的2条建议,我会给你打勾我的FlushMode是自动的,但我仍然需要在我的childsession上调用
.Flush()
。为什么?我的FlushMode是Auto,但我仍然需要在我的childsession上调用
.Flush()
。为什么?我的FlushMode是Auto,但我仍然需要在我的childsession上调用
.Flush()
。为什么?我的FlushMode是Auto,但我仍然需要在我的childsession上调用
.Flush()
。为什么呢?
var childSession = session.GetSession(EntityMode.Poco);
var logItem = new AdministrationAuditLog
                {
                    LogDate = DateTime.Now,
                    Message = message,
                    User = databaseLogin.User
                };

childSession.SaveOrUpdate(logItem);