NHibernate 会话管理建议

Posted

技术标签:

【中文标题】NHibernate 会话管理建议【英文标题】:NHibernate Session Management Advice 【发布时间】:2010-12-29 00:22:11 【问题描述】:

我需要一些关于 C# WinForms 应用程序的 NHibernate 会话管理的建议。

我目前正在移植一个应用程序以使用 NHibernate。我还采用了 UnitOfWork 模式,如下面的链接所述;

http://nhforge.org/wikis/patternsandpractices/nhibernate-and-the-unit-of-work-pattern.aspx

我的问题与会话有关。

    能否始终让每个线程只运行一个会话?

    我有一个场景,其中会话 (UnitOfWork) 可能为应用程序显示的表单打开,但用户打开另一个表单(即工具 - 选项),我希望拥有自己的 UnitOfWork。显然,在这种情况下,为“工具 - 选项”表单打开另一个会话而不使用当前打开的会话用于基础表单会更有意义。

    我们可以在一个线程上创建一个会话字典吗?

感谢任何有关会话管理的建议。

【问题讨论】:

【参考方案1】:

+1 杰伊所说的话。我还建议阅读 Oren Eini 关于使用 NHibernate 构建桌面待办事项应用程序的文章:

http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

它使用 WPF 作为 UI 技术,但他所说的一切(桌面应用程序中的 NHibernate)都与 WinForms 同样相关。

【讨论】:

【参考方案2】:

1 - 您可以根据用例的需要拥有任意数量的会话。

2 - 没关系,基于 1。

3 - 您可以将会话变量放入字典或任何其他集合中。

除非您真的知道自己在做什么以及为什么,否则您不应该做什么:

在多个线程中使用同一个会话 将实体从一个会话/UoW 传递到另一个 尝试重用已引发异常的会话(即使您认为自己知道自己在做什么,也不要这样做)

【讨论】:

以上是关于NHibernate 会话管理建议的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET 中的 FluentNHibernate 会话管理

将 NHibernate 开放会话合并到 DB(耦合 NHibernate 和 DB 会话)

ASP.NET MVC、NHibernate 会话和 NHibernate 事件

NHibernate 将会话传递到存储库

WPF MVVM 中的 NHibernate 会话

会话已关闭对象名称:'ISession'。在 NHibernate.Impl.AbstractSessionImpl.ErrorIfClosed() - 如何阻止会话过早关闭