在 Winforms 和 WPF 中使用 NHibernate 几年之后,我似乎仍然错过了一个非常重要的点,当我运行这段代码片段时,这一点变得太明显了:
ISessionFactory sf = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c => c.Is(connectionString)))
.Mappings(x => x.FluentMappings
.AddFromAssemblyOf<MyClass>())
.BuildSessionFactory();
for (int i = 0; i < 100; i++)
{
new Task(()=>
{
Console.WriteLine("{0}, {1}",
i,
sf.OpenSession().QueryOver<MyClass>().List().Count);
}).Start();
}
我猜这会造成很大的负担。
老实说,我记得读过的关于会话处理的唯一内容是:实现工作单元,它声明了原子会话。所以,看看模式,我有一些顾虑/问题。
延迟加载如何适合图片?如果我使用一个会话加载我的数据,然后关闭它,延迟加载将不起作用。因此,基本上,工作单元不能关闭/处置 Session,这意味着它是无限大的。
会话具有诸如
IsDirty
. 如果加载和保存对象是由单独的会话完成的,那么这还能如何使用呢?
编辑:奥伦·艾尼(Oren Eini)在他的早期文章中已经说过与成为问题相同的事情。在那里,他说 MicroManaging(=> use 和 immediate Dispose
)切断了 NH 功能,如 LazyLoading 和 ChangeTracking。不过,在我看来,UnitOfWork 是一种会话微管理模式。那么,最干净的解决方案是什么?自己跟踪更改并使用 MicroManagement?单片会话(= Memleak 设计)?如果与 Oren 的示例不同,您没有很多可以限制会话生命周期的子对话框怎么办?