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

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

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

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

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

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

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

  

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

 

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

  

代码
using (ITransaction tx = _session.BeginTransaction())
{
    
try
    {
        
//一些保存、更新、删除等操作
        tx.Commit();
    }
    
catch (HibernateException)
    {
        tx.Rollback();
        
throw;
    }
}

 


  以上就是本章的主要内容,接下来看实例:

  在业务逻辑层(DAL或DATA)新建一个CRUD.CS类,代码如下:

 

代码
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

posted on 2010-05-04 10:24  neekey  阅读(508)  评论(0)    收藏  举报

导航