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

时间:2010-03-08 00:55:23

标签: nhibernate hibernate design-patterns

我正在使用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. 内置脏跟踪如何检测已删除的对象?

1 个答案:

答案 0 :(得分:5)

  

我的ISession的生命周期应该是什么?

有几个问题可以解决这个问题:

  

NHibernate会提供某种内置的脏跟踪,还是我自己必须这样做?

NHibernate内置了脏跟踪功能。

  

这是怎么做到的?

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

  

没有巨大的开销吗?

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

  

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

     

这些缓存是什么?

     

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

     

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

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

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