Nhibernate 使用(N)Hibernate的基本模式是什么?

Nhibernate 使用(N)Hibernate的基本模式是什么?,nhibernate,hibernate,design-patterns,Nhibernate,Hibernate,Design Patterns,我正在用NHibernate创建一个简单的Windows窗体应用程序,我对如何使用它有点困惑。引用手册: ISession(NHibernate.ISession) 表示应用程序和持久存储之间对话的单线程、短期对象。包装ADO.NET连接。工厂为ITransaction。保存持久对象的强制(第一级)缓存,用于导航对象图或按标识符查找对象 现在,假设我有以下场景: 我有一个简单的分类器,它是一个MSSQL表,有两列-ID(auto_increment)和Name(nvarchar)。为了编辑这个分

我正在用NHibernate创建一个简单的Windows窗体应用程序,我对如何使用它有点困惑。引用手册:

ISession(NHibernate.ISession)

表示应用程序和持久存储之间对话的单线程、短期对象。包装ADO.NET连接。工厂为ITransaction。保存持久对象的强制(第一级)缓存,用于导航对象图或按标识符查找对象

现在,假设我有以下场景:

我有一个简单的分类器,它是一个MSSQL表,有两列-ID(auto_increment)和Name(nvarchar)。为了编辑这个分类器,我创建了一个表单,其中包含一个gridview和两个按钮-OK和Cancel。用户几乎可以直接在gridview中编辑表,当他点击OK时,他所做的更改将被保存到DB中(或者如果点击cancel,则不会发生任何事情)

现在,我有几个关于如何组织的问题:

  • 我的
    会话的生命周期应该是什么?
    我是否应该为我的整个应用程序创建一个
    ISession
    ;我的每个表单的ISession(应用程序是单线程MDI);还是每个DB操作/事务的ISession
  • NHibernate是否提供某种内置的脏追踪功能,还是我必须自己做?手册在这里和那里提到了类似的内容,但没有详细说明。
  • 这是怎么做到的
  • 不是有很大的开销吗
  • 它是否以某种方式与NHibernate拥有的缓存相关联
  • 这些缓存是干什么用的
  • 它们不是特定于单个
    会话的吗?也就是说,如果我对每个事务使用单独的
    ISession
    ,它不会破坏脏跟踪吗
  • 内置脏跟踪如何检测已删除的对象
  • 我的假期应该是什么样的

    有几个问题涉及这一点:

    NHibernate是否提供某种内置的脏追踪功能,还是我必须自己做

    NHibernate具有内置的脏跟踪功能

    这是怎么做到的

    简而言之,EntityEntry在加载时保留实体的状态,然后在刷新会话时,将此加载状态与实际状态进行比较。具有不同值的字段/属性被标记为脏字段。它实际上比这复杂得多,但是作为一个用户,你不需要确切地知道它是如何工作的

    不是有很大的开销吗

    不需要。如果您在一个会话中管理大量实体,这只是一个问题(无论如何,您都不应该这样做)

    它是否以某种方式与NHibernate拥有的缓存相关联

    这些缓存是干什么用的

    它们不是特定于单个会话吗?也就是说,如果我对每个事务使用单独的ISession,它不会破坏脏跟踪吗

    内置脏跟踪如何检测已删除的对象

    您似乎混淆了脏跟踪、缓存和并发。缓存和并发是高度可配置的,这些文章对它们进行了很好的解释:

    脏跟踪行为也可以被覆盖,但默认行为适用于99%的情况

    我的假期应该是什么样的

    有几个问题涉及这一点:

    NHibernate是否提供某种内置的脏追踪功能,还是我必须自己做

    NHibernate具有内置的脏跟踪功能

    这是怎么做到的

    简而言之,EntityEntry在加载时保留实体的状态,然后在刷新会话时,将此加载状态与实际状态进行比较。具有不同值的字段/属性被标记为脏字段。它实际上比这复杂得多,但是作为一个用户,你不需要确切地知道它是如何工作的

    不是有很大的开销吗

    不需要。如果您在一个会话中管理大量实体,这只是一个问题(无论如何,您都不应该这样做)

    它是否以某种方式与NHibernate拥有的缓存相关联

    这些缓存是干什么用的

    它们不是特定于单个会话吗?也就是说,如果我对每个事务使用单独的ISession,它不会破坏脏跟踪吗

    内置脏跟踪如何检测已删除的对象

    您似乎混淆了脏跟踪、缓存和并发。缓存和并发是高度可配置的,这些文章对它们进行了很好的解释:


    脏跟踪行为也可以被覆盖,但默认行为适用于99%的情况。

    什么是“大量”实体?@snicker:取决于实体大小,但我认为大约200+。在一个会话中有这么多实体是非常罕见的。有关这方面的更多信息,请参阅。Ayende通常从webapp的角度发言,在webapp中,这200多个对象可能会为访问应用程序的N个用户保留。你认为在这种情况下,或者在其他只有一个用户的桌面应用程序中,这会有所不同吗?对于一个应用程序来说,同时加载和跟踪5000多个实体似乎是荒谬的吗?对于一个1kb的“大”实体来说,仅实体内存就只有5000kb。我对桌面应用程序没有太多经验,但对我来说,一次会话中有5000个实体听起来很荒谬。WinForms中的一个会话只能跨一个工作单元,因此5000多个实体实在太多了。实际上,一个会话实例中不需要有那么多的实体。一点提示:如果会话中有那么多的实体需要更新(并因此刷新),那就太多了。如果是只读会话,那么就没有问题,因为没有刷新。什么是“巨大”的实体数?@snicker:取决于实体大小,但我想大约200+。在一个会话中有这么多实体是非常罕见的。硒