NHibernate处理外部数据库更新

时间:2016-01-28 08:39:14

标签: .net nhibernate fluent-nhibernate

我们有两个C#项目,一个是Web应用程序,另一个是控制台。两者都使用 NHibernate + Fluent 来进行任何数据库操作。两个应用程序都在同一台机器上运行。

但是,我们注意到当控制台应用程序执行数据库更新时,Web应用程序中的那些相同对象变得陈旧,更令人担忧的是,在Web应用程序中更新它们然后保存它们会将陈旧对象保存回数据库,从控制台应用程序中丢失更新。

是否存在防止此类行为的机制或设置,而无需在每次使用/引用一个对象时对每个对象调用.Refresh方法?

1 个答案:

答案 0 :(得分:1)

是的,您可以使用版本化实体,但在保存陈旧实体的情况下,它只会抛出一个异常,告诉您正在尝试保存过时的实体。你需要处理这个问题。

版本列上的Nhibernate文档: http://nhibernate.info/doc/nhibernate-reference/mapping.html#mapping-declaration-version

还有几个关于此的堆栈溢出帖子: When to use Nhibernate <version>? How do you do Versioning in Nhibernate?

https://ayende.com/blog/3946/nhibernate-mapping-concurrency

修改

如果您不想改变处理会话的方式,您可以做几件事。

在某些时候调用ISession.Clear()以清除会话中的所有内容,以便后续调用ISession.Get将从数据库返回对象而不是缓存。

为特定实体实例调用ISession.Evict()。这将从缓存中删除实体,后续调用将从数据库返回对象而不是缓存。

https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/ISession.cs