NHibernate 处理外部数据库更新
NHibernate handling external database update
我们有两个 C# 项目,一个是 Web 应用程序,另一个是控制台应用程序。两者都使用 NHibernate+Fluent 进行任何数据库操作。两个应用程序 运行 在同一台机器上。
但是,我们注意到,当控制台应用程序执行数据库更新时,网络应用程序中的那些相同对象变得陈旧,更令人担忧的是,在网络应用程序中更新它们然后保存它们会将陈旧对象保存回来到数据库,丢失来自控制台应用程序的更新。
是否有一种机制或设置可以防止这种行为,而不必每次 use/refer 对每个对象调用 .Refresh 方法?
是的,您可以使用版本化实体,但在保存陈旧实体的情况下,它只会抛出一个异常,告诉您正在尝试保存陈旧实体。你需要处理这个。
关于版本列的 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 的调用将从数据库中 return 对象而不是缓存。
为特定实体实例调用 ISession.Evict()。这将从缓存中删除实体,随后的调用将从数据库中 return 个对象而不是缓存中。
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/ISession.cs
我们有两个 C# 项目,一个是 Web 应用程序,另一个是控制台应用程序。两者都使用 NHibernate+Fluent 进行任何数据库操作。两个应用程序 运行 在同一台机器上。
但是,我们注意到,当控制台应用程序执行数据库更新时,网络应用程序中的那些相同对象变得陈旧,更令人担忧的是,在网络应用程序中更新它们然后保存它们会将陈旧对象保存回来到数据库,丢失来自控制台应用程序的更新。
是否有一种机制或设置可以防止这种行为,而不必每次 use/refer 对每个对象调用 .Refresh 方法?
是的,您可以使用版本化实体,但在保存陈旧实体的情况下,它只会抛出一个异常,告诉您正在尝试保存陈旧实体。你需要处理这个。
关于版本列的 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 的调用将从数据库中 return 对象而不是缓存。
为特定实体实例调用 ISession.Evict()。这将从缓存中删除实体,随后的调用将从数据库中 return 个对象而不是缓存中。
https://github.com/nhibernate/nhibernate-core/blob/master/src/NHibernate/ISession.cs