我正在使用NHibernate创建一个简单的Windows窗体应用程序,我对我应该如何使用它感到有点困惑。引用手册:
ISession(NHibernate.ISession)
单线程,短期对象,表示应用程序与持久性存储之间的对话。包装ADO.NET连接。 ITransaction的工厂。保存持久对象的强制(第一级)缓存,在导航对象图或按标识符查找对象时使用。
现在,假设我有以下情况:
我有一个简单的分类器,它是一个有两列的MSSQL表--ID(auto_increment)和Name(nvarchar)。要编辑此分类器,我创建一个包含单个gridview和两个按钮的表单 - “确定”和“取消”。用户几乎可以直接在gridview中编辑表格,当他点击OK时,他所做的更改会持久保存到DB(或者如果他点击取消,则没有任何反应)。
现在,我有几个关于如何组织这个问题的问题:
ISession
的生命周期应该是多少?
我应该为整个应用程序创建一个ISession
;每个表单的一个ISession(应用程序是单线程MDI);或每个数据库操作/事务的ISession?ISession
吗?也就是说,如果我为每笔交易使用单独的ISession
,是否会破坏脏跟踪?答案 0 :(得分:5)
我的ISession的生命周期应该是什么?
有几个问题可以解决这个问题:
NHibernate会提供某种内置的脏跟踪,还是我自己必须这样做?
NHibernate内置了脏跟踪功能。
这是怎么做到的?
简而言之,EntityEntry在加载实体时保持实体的状态,然后在刷新会话时将此加载状态与实际状态进行比较。具有不同值的字段/属性标记为脏。它实际上比这复杂得多,但作为用户,您不需要确切知道它是如何工作的。
没有巨大的开销吗?
没有。如果您在一个会话中管理大量实体(这是您不应该做的事情),这只是一个问题。
它是否与NHibernate的缓存有某种联系?
这些缓存是什么?
它们不是特定于单个ISession吗?也就是说,如果我为每笔交易使用单独的ISession,它不会打破脏跟踪吗?
内置脏跟踪如何检测已删除的对象?
您似乎对脏跟踪,缓存和并发感到困惑。缓存和并发是高度可配置的,这些文章很好地解释了它们:
也可以覆盖脏的跟踪行为,但默认行为适用于99%的情况。