在 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 处理的唯一内容是:Implement Unit Of Work,它宣布了原子 session 。所以,taking a look at the pattern ,我有一些顾虑/问题。
IsDirty
等功能.如果加载和保存对象是由单独的 session 完成的,如何仍然可以利用它? 编辑: Oren Eini 在早期的 article 中曾说过同样的事情是一个问题。他的。在那里,他说 MicroManaging(=> 使用并立即使用
Dispose
)切断了 NH 功能,如 LazyLoading 和 ChangeTracking。不过在我看来,UnitOfWork 是一种 session 微观管理模式。那么,最干净的解决方案是什么?自己跟踪更改并使用 MicroManagement?单片 session (= Memleak 设计)?如果与 Oren 的示例不同,您没有许多可以限制 session 生存期的子对话框怎么办?
最佳答案
How does lazy loading fit in the picture?
延迟加载适合一个 session 的图片。加载对象后,延迟加载允许遍历对象的图形,而无需知道对象属性是否已从数据库加载,也无需急切地加载所有对象图形。
看起来很完美,但也有问题,比如“n+1 select”
If I load my Data using one session, and then close it, lazy loading won't work.
另一个 session ,从 db 加载相同的对象,不会从前一个 session 中延迟加载的属性中受益。
So, basically, the unit of work can not close / dispose the Session, meaning it is infinitely large.
我不确定我是否理解这一点。我猜 Session 是工作单元。
Sessions have features like IsDirty. If loading and saving objects is done by separate sessions, how can this still be utilized?
加载和保存不应在单独的 session 中完成。我想这是 IsDirty 属性的重点。
这可能会给你很多关于 NH 处理的提示:https://softwareengineering.stackexchange.com/q/100534
希望这会有所帮助
编辑:关于你的第二个问题。通常的网络场景如下:
1,2和4是第一工作单元的部分。 5、6、7、8 和 9 是第二个工作单元的一部分。
关于nhibernate - 如何在 NHibernate 中将 session 作为工作单元进行管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020439/