gpt4 book ai didi

nhibernate - 在 PreInsert/PreDelete 事件监听器中保存新实体不会持久保存到数据库

转载 作者:行者123 更新时间:2023-12-04 15:26:49 24 4
gpt4 key购买 nike

我在 NHibernate 2.1 中配置了 PreInsert 和 PreDelete 事件监听器。对于特定表上的插入和删除,我想将审计事件写入单独的审计表。

public class AuditEventListener : IPreInsertEventListener, IPreDeleteEventListener 
{
private static readonly ILog Log = LogManager.GetLogger(typeof(AuditEventListener));

public bool OnPreInsert(PreInsertEvent @event)
{
if (!(@event.Entity is IAuditable))
return false;

return AuditEvent(@event.Session.GetSession(EntityMode.Poco),
true, (@event.Entity as IAuditable));
}

public bool OnPreDelete(PreDeleteEvent @event)
{
if (!(@event.Entity is IAuditable))
return false;

return AuditEvent(@event.Session.GetSession(EntityMode.Poco),
false, (@event.Entity as IAuditable));
}

private bool AuditEvent(ISession session, bool isInsert, IAuditable entity)
{
if (entity is ArticleBinding)
{
if (Log.IsDebugEnabled)
Log.DebugFormat(" audit event ({0}), entity is ArticleBinding", ((isInsert) ? "Insert" : "Delete"));

AddArticleBindingAuditEvent(session, isInsert,
(entity as ArticleTagBinding));

}
return false;
}

private void AddArticleBindingAuditEvent(ISession session,
bool isInsert, ArticleBinding binding)
{
var auditRecord = new AuditArticleBinding()
{
ArticleId = binding.ArticleId,
Action = (isInsert) ? "Add" : "Delete",
LoggedBy = string.IsNullOrEmpty(Thread.CurrentPrincipal.Identity.Name)
? "Unknown"
: Thread.CurrentPrincipal.Identity.Name
};

session.Save(auditRecord);
}
}

我解决了使用同一个 session 的问题,这导致了异常。现在,所有代码都运行良好,我的日志语句被命中,但审计记录从未被插入。使用 NHProf,我可以看到 INSERT 调用从未发生。

为什么上面的代码不会导致插入?

最佳答案

我目前正在做完全相同的事情并且遇到了同样的问题。试图保存一个新实体和 INSERT语句甚至没有执行。我找到了一篇关于 using Pre[Update|Insert]Listeners to audit per record 的文章其中一条评论询问插入一个新实体,作者回答说需要一个子 session 。

private void AddArticleBindingAuditEvent(ISession session, 
bool isInsert, ArticleBinding binding)
{
var childSession = e.Session.GetSession(EntityMode.Poco);
var auditRecord = new AuditArticleBinding()
{
ArticleId = binding.ArticleId,
Action = (isInsert) ? "Add" : "Delete",
LoggedBy = string.IsNullOrEmpty(Thread.CurrentPrincipal.Identity.Name)
? "Unknown"
: Thread.CurrentPrincipal.Identity.Name
};

childSession.Save(auditRecord);
childSession.Flush();
}

你的另一个引用(我今天找到的)是 Auditing with NHibernate Listeners .它提供了一个关于插入新审计日志的完整示例,但使用了 Post 监听器并且是非实体特定的(与我使用持久程序几乎相同以查找更改的值)。我不确定使用 Pre 监听器的好处是什么。

作为“以防万一”,您需要确保将事件监听器与您的配置 Hook :
var eventListener = new AuditEventListener();
config.SetListener(ListenerType.PreInsert, eventListener);
config.SetListener(ListenerType.PreDelete, eventListener);

全面公开 :我对 NHibernate 还很陌生,所以如果有什么我遗漏或可以做得更好的地方,请告诉我。上述方法对我有用,因为我的记录已成功插入到数据库中,但在某些情况下确实会失败。虽然我几乎可以肯定这特定于我的应用程序(我是代码库的新手,所以仍在解决问题)

关于nhibernate - 在 PreInsert/PreDelete 事件监听器中保存新实体不会持久保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com