Session NHibernate IPreUpdateEventListener不';t插入第二个表
我正在原型化一些简单的审计日志功能。我有一个中型实体模型(~50个实体),我想在大约5或6个实体上实现审计日志记录。最终,我希望在插入和删除上也能做到这一点,但现在我只关注更新 问题是,当我从EventListener中执行session.Save(或SaveOrUpdate)到我的auditLog表时,原始对象被正确地持久化(更新),但我的auditLog对象从未被插入 我认为在NHibernate save生命周期的后期调用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
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);