【问题标题】:How to load an entity from database directly other than cache using NHibernate如何直接从数据库加载实体而不是使用 NHibernate 缓存
【发布时间】:2011-11-30 01:28:03
【问题描述】:

我正在使用 NHibernate 来处理数据访问层。在对实体进行更改后并在调用 ISession.Update(entity) 之前,我想直接从数据库中获取实体的副本,然后将其保存到审计表中以进行历史跟踪。但问题是,实体是由 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


    【解决方案1】:

    你不应该像这样手工制作它。已经有 NHibernate 工具可以为您做到这一点 - 参见例如 NHibernate.Envers

    如果您真的想自己实现它,您应该更深入一些级别,这样跟踪实体历史记录就不是您的存储库责任,因为这似乎破坏了Single Responsibility Principle 并且很容易绕过。您应该将其实现为侦听更新事件并透明保存以前版本的侦听器,以便您的代码不知道审计 - 参见例如 here

    【讨论】:

    • 在我发布问题几分钟后,我找到了 IPreXXXXEventListener 解决方案。这正是我正在寻找的。感谢您提供示例链接!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 2021-06-05
    • 2012-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多