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

Vil*_*lx- 0 nhibernate design-patterns hibernate

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

ISession(NHibernate.ISession)

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

现在,假设我有以下情况:

我有一个简单的分类器,它是一个MSSQL表,有两列 - ID(auto_increment)和Name(nvarchar).要编辑此分类器,我创建一个包含单个gridview和两个按钮的表单 - "确定"和"取消".用户几乎可以直接在gridview中编辑表格,当他点击OK时,他所做的更改会持久保存到DB(或者如果他点击取消,则没有任何反应).

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

  1. 我的一生ISession应该怎样?我应该ISession为我的整个应用程序创建一个单独的; 每个表单的一个ISession(应用程序是单线程MDI); 或每个数据库操作/事务的ISession?
  2. NHibernate是否提供某种内置的脏跟踪或者我自己必须这样做?手册在这里和那里提到类似的东西,但没有详细说明.
    1. 这是怎么做到的?
    2. 是不是有巨大的开销?
    3. 它是否与NHibernate的缓存有某种联系?
    4. 这些缓存是什么?
    5. 它们不是特定的单一ISession吗?也就是说,如果我ISession为每笔交易使用一个单独的,它不会打破脏跟踪吗?
    6. 内置脏跟踪如何检测已删除的对象?

Mau*_*fer 5

我的ISession的生命周期应该是多少?

几个问题解决了这个:

NHibernate是否提供某种内置的脏跟踪或者我自己必须这样做?

NHibernate内置了脏跟踪功能.

这是怎么做到的?

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

是不是有巨大的开销?

不.如果您在一次会议中管理大量实体(这是您不应该做的事情),这只是一个问题.

它是否与NHibernate的缓存有某种联系?

这些缓存是什么?

它们不是特定于单个ISession吗?也就是说,如果我为每笔交易使用单独的ISession,它会不会打破脏跟踪?

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

您似乎对脏跟踪,缓存和并发性感到困惑.缓存和并发是高度可配置的,这些文章很好地解释了它们:

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