nhibernate - 如何在 NHibernate 中将 session 作为工作单元进行管理?

标签 nhibernate unit-of-work

在 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 ,我有一些顾虑/问题。
  • 延迟加载如何适合图片?如果我使用一个 session 加载我的数据,然后关闭它,延迟加载将不起作用。所以,基本上,工作单元不能关闭/处理 session ,这意味着它是无限大的。
  • session 具有 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

    希望这会有所帮助

    编辑:关于你的第二个问题。通常的网络场景如下:
  • 开启 NH session
  • 加载 NH 实体
  • 在 POCO 中传输 NH 实体属性以在 UI 中显示(当然要跟踪 Id)
  • 关闭NH时段
  • 稍后(用户进行了一些更改并点击“保存”按钮),打开 NH session
  • 加载相应的 NH 实体(通过其 ID)
  • 根据新的POCO字段更新NH实体
  • 保留数据库中的更改
  • 关闭NH时段

  • 1,2和4是第一工作单元的部分。 5、6、7、8 和 9 是第二个工作单元的一部分。

    关于nhibernate - 如何在 NHibernate 中将 session 作为工作单元进行管理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15020439/

    相关文章:

    nhibernate - 在 nHibernate : "Index was out of range." 中更新时出错

    asp.net - NHibernate 的 log4net 未将任何内容写入 ASP.NET 跟踪

    c# - 现有数据库上的 Fluent NHibernate 多对多关系

    c# - Entity Framework + 生命周期 + StructureMap + 工作单元 + Windows 窗体?

    entity-framework - 如何在 Entity Framework 中使用存储过程 + 存储库 + 工作单元模式?

    asp.net-mvc-3 - MVC3-EF4 : One DbContext for all Repositories and ViewModels - UnitOfWork?

    c# - 保存时的 NHibernate FlushMode

    nhibernate - 'NHibernate.Cfg.Configuration' 的类型初始值设定项引发异常

    multithreading - WCF 中的 UnitOfWork 与 Quartz(线程)

    asp.net-mvc - TDD 工作单元模式 Moq 无法实例化类错误代理