我正在使用NHibernate来处理数据访问层。在对实体进行更改之后,在调用ISession.Update(实体)之前,我希望直接从数据库中获取实体的副本,然后将其保存到审计表中,以用于历史记录跟踪。但问题是,实体是由NHibernate缓存的。似乎没有办法强制NHibernate在实体缓存后直接调用数据库?
我知道我可以在对实体进行任何更改之前制作副本。我只是想知道是否有可能强制NHibernate绕过缓存命中数据库?或者追踪历史的最佳做法是什么?
这是我的EntityRepository Update方法:
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();
}
}
非常感谢! 利奥
答案 0 :(得分:1)
你不应该像这样手工制作它。已经有NHibernate工具为您做到这一点 - 例如参见NHibernate.Envers。
如果您真的希望自己实现这一点,那么您应该更深入一些,因此跟踪实体历史不是您的存储库责任,因为这似乎打破Single Responsibility Principle并且很容易旁路。您应该将其实现为侦听更新事件并以透明方式保存以前版本的侦听器,以便您的代码不会发现审计 - 请参阅例如here。