目录
写在前面
上篇文章介绍了nhibernate的基于面向对象的条件查询。对一个项目来说,增删改查是必不可少的,虽然实现方式不同,但是总有涉及到这部分的代码。之前跟朋友说过一个笑话,你要会增删改查了,一切问题就不是问题了,在加上业务处理基本上就完成一个项目了。可能说的是有点过了,但是我觉得在编码中,重要的是你的业务处理能力,在公司很少人能能站在项目框架或者架构的决策的位置,这个时候,作为开发来说不就是负责模块吗?而这些模块,你如果留心会发现,到处的增删改查,而且样子基本相同。
使用过Eentity framework或者Linq to Sql的童鞋都知道,在你进行删除,修改和添加的时候,这些改变的数据,其实并没有立即从数据库中删除,而是存在内存中,直到你使用数据库上下文的SaveChange()方法或者SubmitChanges()才会把数据提交给数据库,而这些操作要么提交,要么回滚。
在Nhibernate中其实一样道理,数据也是存在内存中,直到你调用ISession的Flush()方法才会将数据提交到数据库(成功或者回滚(这个回滚跟事务的回滚是否有区别,下篇文章学过事务之后,再做比较))。
文档与系列文章
[NHibernate]持久化类(Persistent Classes)
[NHibernate]集合类(Collections)映射
[NHibernate]缓存(NHibernate.Caches)
[NHibernate]NHibernate.Tool.hbm2net
[NHibernate]Nhibernate如何映射sqlserver中image字段
[NHibernate]条件查询Criteria Query
添加数据
创建一个customer对象,然后调用ISession的Save方法加到内存,调用ISession的Flush方法添加到数据库,代码如下:
1 /// <summary> 2 /// 添加客户 3 /// </summary> 4 /// <param name="customer">客户实体</param> 5 /// <returns>是否添加成功 </returns> 6 public bool AddCustomer(Customer customer) 7 { 8 9 try 10 { 11 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 12 var session = nhibernateHelper.GetSession(); 13 //将customer对象写入内存 14 session.Save(customer); 15 //更新到数据库 16 session.Flush(); 17 return true; 18 } 19 catch (Exception ex) 20 { 21 throw ex; 22 } 23 }
熟悉IO操作的朋友应该发现了,在将字节流写入文件的时候,如果不Flush或者close(dispose),这个时候你会发现,写入的文件是没有内容的。只有在Flush或者Close之后,才会将内存中的字节流写入文件。
删除数据
描述:获取要删除的对象,然后将该对象删除,代码如下:
1 /// <summary> 2 /// 删除客户信息 3 /// </summary> 4 /// <param name="customer">客户对象</param> 5 /// <returns>是否删除成功</returns> 6 public bool DeleteCustomer(Customer customer) 7 { 8 try 9 { 10 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 11 var session = nhibernateHelper.GetSession(); 12 // Remove a persistent instance from the datastore 13 session.Delete(customer); 14 session.Flush(); 15 return true; 16 } 17 catch (Exception) 18 { 19 throw; 20 } 21 }
修改数据
描述:根据传进的新的客户实体,修改客户信息。代码如下:
1 /// <summary> 2 /// 修改客户信息 3 /// </summary> 4 /// <param name="customer">客户对象</param> 5 /// <returns>是否修改成功</returns> 6 public bool UpdateCustomer(Customer customer) 7 { 8 try 9 { 10 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 11 var session = nhibernateHelper.GetSession(); 12 //Update the persistent instance with the identifier of the given transient instance. 13 session.Update(customer); 14 session.Flush(); 15 return true; 16 } 17 catch (Exception) 18 { 19 throw; 20 } 21 }
添加修改数据
Nhibernate中有这样一种方法,如果该对象存在则去修改,如果不存在则添加。
ISession可以识别出这不同的对象,并为我们提供了ISession.SaveOrUpdate(object)方法。
ISession.SaveOrUpdate(object)方法完成如下工作:
-
- 检查这个对象是否已经存在Session中。
- 如果对象不在,调用Save(object)来保存。
- 如果对象存在,检查这个对象是否改变了。
- 如果对象改变,调用Update(object)来更新。
代码如下:
1 /// <summary> 2 /// 添加或者修改客户信息 3 /// </summary> 4 /// <param name="customer">客户对象</param> 5 /// <returns>是否修改或添加成功成功</returns> 6 public bool SaveOrUpdateCustomer(Customer customer) 7 { 8 try 9 { 10 NHibernateHelper nhibernateHelper = new NHibernateHelper(); 11 var session = nhibernateHelper.GetSession(); 12 //Either Save() or Update() the given instance, depending upon the value of 13 //its identifier property. 14 session.SaveOrUpdate(customer); 15 session.Flush(); 16 return true; 17 } 18 catch (Exception) 19 { 20 throw; 21 } 22 }
在项目中,在修改或者新增数据中,用的最多的是SaveOrUpdate()方法。用起来也很方便,新增或者更新,让程序自己去判断。
测试,添加一个新的用户,然后去修改该用户信息。
1 /// <summary> 2 /// 添加客户信息 3 /// </summary> 4 /// <param name="sender"></param> 5 /// <param name="e"></param> 6 protected void btnAdd_Click(object sender, EventArgs e) 7 { 8 Guid guidCustomerID = Guid.NewGuid(); 9 var customer = new Customer() { CustomerName = "zhangsan", CustomerAddress = "北京 海淀", CustomerID = guidCustomerID }; 10 Business.CustomerBusiness customerBusiness = new Business.CustomerBusiness(); 11 //如果客户信息不存在则添加 12 if (customerBusiness.SaveOrUpdateCustomer(customer)) 13 { 14 customer = new Customer() { CustomerName = "wanger", CustomerAddress = "上海", CustomerID = guidCustomerID }; 15 //客户信息存在则修改 16 if (customerBusiness.SaveOrUpdateCustomer(customer)) 17 { 18 RepeaterDataBind(); 19 } 20 } 21 }
结果
生成的sql语句
总结
本篇文章介绍了增删改查方法,在项目中用的最多的也是这几种方法,比如你定义一个接口,接口里面就可以定义这四种方法。