您的位置:首页 > 其它

NHIbernate学习之旅【四】——非查询及事务

2010-05-04 10:24 316 查看
  这篇讲非查询及事务,通过前面几章学习,我们都读NHibernate有了一定了解,多数操作都是通过ISESSION进行的,非查询也不例外。

  我们还是在原来的项目上扩展。非查询主要包括增删改,NHibernate通过以下方法进行:

_session.Save(customer); //添加一条新的customer数据。

  _session.Update(customer); //修改customer数据

  _session.Delete(customer); //删除customer数据

事务通过ITransaction来执行,代码如下:

  

ITransaction tx = _session.BeginTransaction();
//一些保存、更新、删除等操作
tx.Commit();

  用到事务时,最好加上Using(){} ,以便用完后自动清理内存;

  

代码

using System;
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: