如何使用NHibernate直接从数据库而不是缓存加载实体

如何使用NHibernate直接从数据库而不是缓存加载实体,nhibernate,Nhibernate,我使用NHibernate来处理数据访问层。在对实体进行更改之后,在调用ISession.Update(实体)之前,我希望直接从数据库中获取实体的副本,然后将其保存到审计表中,以便进行历史记录跟踪。但问题是,实体是由NHibernate缓存的。如果实体已缓存,似乎没有办法强制NHibernate直接调用数据库 我知道我可以在对实体进行任何更改之前制作一份副本。我只是想知道是否有可能迫使NHibernate绕过缓存访问数据库?或者追踪历史的最佳实践是什么 以下是我的EntityRepository

我使用NHibernate来处理数据访问层。在对实体进行更改之后,在调用ISession.Update(实体)之前,我希望直接从数据库中获取实体的副本,然后将其保存到审计表中,以便进行历史记录跟踪。但问题是,实体是由NHibernate缓存的。如果实体已缓存,似乎没有办法强制NHibernate直接调用数据库

我知道我可以在对实体进行任何更改之前制作一份副本。我只是想知道是否有可能迫使NHibernate绕过缓存访问数据库?或者追踪历史的最佳实践是什么

以下是我的EntityRepository更新方法:

public void Update(BusinessObject Entity) {

        //I would like to get the existing data from database directly.
        //It doesn't work as the entity is cached
        BusinessObject OldEntity = GetById(Entity.Id);

        using (ITransaction trx = session.BeginTransaction()) {

            session.Update(Entity);

            //Add to history tracking table
            History.Add(OldEntity, Entity, "Update");

            trx.Commit();
        }
    }
非常感谢!
狮子座

你不应该像这样手工制作。已经有NHibernate工具可以为您实现这一点——例如,请参见


如果您真的想自己实现这一点,那么应该深入几层,这样您的存储库就不必负责跟踪实体历史,因为这似乎会中断,而且很容易绕过。您应该将其实现为侦听更新事件并透明地保存以前的版本的侦听器,这样您的代码就不会进行审核—例如,请参阅。

在我发布问题几分钟后,我找到了IPRExxxeventListener解决方案。这正是我要找的。谢谢你的示例链接!