NHIbernate学习之旅【四】——非查询及事务
这篇讲非查询及事务,通过前面几章学习,我们都读NHibernate有了一定了解,多数操作都是通过ISESSION进行的,非查询也不例外。
我们还是在原来的项目上扩展。非查询主要包括增删改,NHibernate通过以下方法进行:
_session.Save(customer); //添加一条新的customer数据。
_session.Update(customer); //修改customer数据
_session.Delete(customer); //删除customer数据
事务通过ITransaction来执行,代码如下:
//一些保存、更新、删除等操作
tx.Commit();
用到事务时,最好加上Using(){} ,以便用完后自动清理内存;
代码
{
try
{
//一些保存、更新、删除等操作
tx.Commit();
}
catch (HibernateException)
{
tx.Rollback();
throw;
}
}
以上就是本章的主要内容,接下来看实例:
在业务逻辑层(DAL或DATA)新建一个CRUD.CS类,代码如下:
代码
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernateSample.Domain.Entities;
namespace NHibernateSample.Data
{
public class CRUD
{
private ISession _session;
private SessionManager _helper;
public CRUD()
{
_helper = new SessionManager();
_session = _helper.GetSession();
}
/// <summary>
/// 根据ID返回CUSTOMER对象
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public Customer GetCustomerById(int id)
{
return _session.Get<Customer>(id);
}
/// <summary>
/// 添加新的Customer
/// </summary>
/// <param name="customer"></param>
/// <returns></returns>
public int CreateCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
int newid = 0;
try
{
newid = (int)_session.Save(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
newid = 0;
tx.Rollback();
}
return newid;
}
}
/// <summary>
/// 删除Customer
/// </summary>
/// <param name="customer"></param>
public void DeleteCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Delete(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
}
}
/// <summary>
/// 修改Customer
/// </summary>
/// <param name="customer"></param>
public void UpdateCustomer(Customer customer)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
_session.Update(customer);
_session.Flush();
tx.Commit();
}
catch (Exception)
{
tx.Rollback();
}
}
}
}
}
然后再在UI进行调用即可,以上代码测试通过。
有人可能注意到了_session.Flush();,之所以每次执行完药用_session.Flush();是因为ISESSION中保存的是内存中的数据,如果不同步Session的话,那么原来调用的Session保存的是修改数据库数据之前的数据。只有调用了Flush()函数才跟数据库的数据同步。
最后,关于非查询中还有一个特殊的方法,ISession.SaveOrUpdate(object)方法,看字面意思就知道,保存或者更新,通过这个方法NHibernate可以自动判断数据时要保存还是更新,如果数据存在则更新,否则添加,代码就不写了,感兴趣的自己试试。
~本篇END

浙公网安备 33010602011771号