我刚刚开始研究NHibernate 2天前,我正在寻找一种基于教程编写的CRUD方法。 我的插入方法是:
using (ISession session = Contexto.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(noticia);
transaction.Commit();
session.Close();
}
“Contexto”的完整代码位于:http://codepaste.net/mrnoo5
我的问题是:我真的需要使用 ITransaction transaction = session.BeginTransaction()和 transaction.Commit(); ?
我问这个是因为我已经测试了运行没有这两行的网络应用程序,并且我已成功插入新记录。
如果可能,有人可以解释一下Itransaction的目的和方法提交吗?
由于
答案 0 :(得分:9)
这是适当的通用NHibernate使用模式:
using (ISession session = sessionFactory.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
//Do the work here
transaction.Commit();
}
所有这些都是确保一切按预期工作所必需的(除非您使用其他基础设施)
关闭会话或对事务做任何事情除了提交都是多余的,因为会话的Dispose
方法和事务负责清理,包括如果有错误则回滚。
重要的是要注意,在异常导致意外行为后,在会话中执行任何,这是限制块内显式异常处理的另一个原因。
答案 1 :(得分:3)
ITransaction transaction = session.BeginTransaction()是没有必要的,因为你通过测试发现了。
但是想象一下,当你的会话引发异常时会发生什么?你如何收回对数据库的更改?
以下是Nhib的引用...
典型的交易应使用以下习语:
ISession sess = factory.OpenSession();
ITransaction tx;
try
{
tx = sess.BeginTransaction(); //do some work ...
tx.Commit();
}
catch (Exception e)
{
if (tx != null)
tx.Rollback();
throw;
}
finally
{
sess.Close();
}
如果ISession抛出异常,则必须回滚该事务 并且会话被丢弃。 ISession的内部状态可能不是 异常发生后与数据库一致。 NHibernate.ISessionFactory
答案 2 :(得分:1)
您在事务上调用Commit(),它会保存对数据库的所有更改。
我真的需要使用ITransaction transaction = session.BeginTransaction()和transaction.Commit();?
是的,即使是简单的阅读,也可以将事务用于所有事情。
测试运行没有这两行的Web应用程序,我已成功插入新记录。
因为当会话被置于using语句的末尾时,会话将提交更改。
无论如何,这就是我保存的方式:
using (ISession session = Contexto.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
try
{
session.Save(noticia);
transaction.Commit();
}
catch(HibernateException)
{
transaction.Rollback();
throw;
}
}
}