Nhibernate中,一般我们用session对数据进行增删改查时都要将session包装在一个事务()中,类似下面的代码:
using (var tx = session.BeginTransaction()) { //这里增加增删改查处理代码 //... tx.Commit(); }
每次都这样显示的去增加session.BeginTransaction()与tx.Commit()是不是很烦呢。
我们可以直接创建一类DataAccessObject来处理这种逻辑,让session每次执行时自动的包裹在事务中
public class DataAccessObject<T, TId> where T : Entity<TId> { private readonly ISessionFactory _sessionFactory; private ISession session { get { return _sessionFactory.GetCurrentSession(); } } public DataAccessObject(ISessionFactory sessionFactory) { _sessionFactory = sessionFactory; } public T Get(TId id) { return Transact(() => session.Get<T>(id)); } public T Load(TId id) { return Transact(() => session.Load<T>(id)); } public void Save(T entity) { Transact(() => session.SaveOrUpdate(entity)); } public void Delete(T entity) { Transact(() => session.Delete(entity)); } /// <summary> /// 使用委托,在方法执行的时候将方法"扔"进下面的事务中 /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="func"></param> /// <returns></returns> private TResult Transact<TResult>(Func<TResult> func) { if (!session.Transaction.IsActive) { // Wrap in transaction TResult result; using (var tx = session.BeginTransaction()) { result = func.Invoke(); tx.Commit(); } return result; } // Don't wrap; return func.Invoke(); } private void Transact(Action action) { Transact<bool>(() => { action.Invoke(); return false; }); } }