NHibernate教程(5)--CRUD操作

NHibernate之旅(5):探索Insert, Update, Delete操作

2008-10-17 16:31 by 李永京, 42903 阅读, 73 评论, 收藏,  编辑

本节内容

  • 操作数据概述
  • 1.新建对象
  • 2.删除对象
  • 3.更新对象
  • 4.保存更新对象
  • 结语

操作数据概述

我们常常所说的一个工作单元,通常是执行1个或多个操作,对这些操作要么提交要么放弃/回滚。想想使用LINQ  to SQL,一切的东西都在内存中操作,只有调用了DataContext.SubmitChanges()方法才把这些改变的数据提交到数据库中,LINQ to  SQL那么提交要么回滚。

我们使用NHibernate也一样,如果只查询数据,不改变它的值,就不需要提交(或者回滚)到数据库。

注意:这节,我们在上一节源代码的基础上,在数据访问层中新建CRUD.cs类用于编写操作方法,在数据访问的测试层新建一CRUDFixture.cs类用于测试。

1.新建对象

简单描述:新建一个对象;调用ISession.Save();同步ISession。

例子:在数据访问层编写CreateCustomer()方法,把传过来的Customer对象保存在数据库中。

public int CreateCustomer(Customer customer)
{int newid = (int)_session.Save(customer);_session.Flush();return newid;
}

我们测试这个方法,新建一个Customer对象,调用CreateCustomer()方法返回新插入的CustomerId,再次根据CustomerId查询数据库是否存在这个对象。

[Test]
public void CreateCustomerTest()
{var customer = new Customer() { Firstname = "YJing", Lastname = "Lee" }; int newIdentity = _crud.CreateCustomer(customer); var testCustomer = _crud.GetCustomerById(newIdentity); Assert.IsNotNull(testCustomer); }

2.删除对象

简单描述:获取一个对象;调用ISession.Delete();同步ISession。

说明:使用ISession.Delete()会把对象的状态从数据库中移除。当然,你的应用程序可能仍然持有一个指向它的引用。所以,最好这样理解:Delete()的用途是把一个持久化实例变成临时实例。  你也可以通过传递给Delete()一个NHibernate 查询字符串来一次性删除很多对象。删除对象顺序没有要求,不会引发外键约束冲突。当然,有可能引发在外键字段定义的NOT NULL约束冲突。

例子:在数据访问层编写DeleteCustomer()方法,从数据库中删除Customer对象。

public void DeleteCustomer(Customer customer)
{_session.Delete(customer);_session.Flush();
}

我们测试这个方法,在数据库中查询CustomerId为2的Customer对象,调用DeleteCustomer()方法删除,再次根据CustomerId查询数据库是否存在这个对象。

[Test]
public void DeleteCustomerTest()
{var coutomer = _crud.GetCustomerById(2);_crud.DeleteCustomer(coutomer);var testCustomer = _crud.GetCustomerById(2);Assert.IsNull(testCustomer);
}

3.更新对象

简单描述:获取一个对象;改变它的一些属性;调用ISession.Update();同步ISession。

例子:在数据访问层编写UpdateCustomer()方法,修改Customer对象。

public void UpdateCustomer(Customer customer)
{_session.Update(customer);_session.Flush();
}

测试这个方法,在数据库中查询CustomerId为1的Customer对象并修改它的Firstname属性值,调用UpdateCustomer()方法更新,再次查询数据库中CustomerId为1的Customer对象的Firstname值为修改之后的值。

[Test]
public void UpdateCustomerTest()
{var customer = _crud.GetCustomerById(1);customer.Firstname = "liyongjing";_crud.UpdateCustomer(customer);var testCustomer = _crud.GetCustomerById(1);Assert.AreEqual("liyongjing", customer.Firstname); }

4.保存更新对象

你会不会想出这个问题?哪些是刚刚创建的对象,哪些是修改过的对象?对于刚刚创建的对象我们需要保存到数据库中,对于修改过的对象我们需要更新到数据库中。

幸好,ISession可以识别出这不同的对象,并为我们提供了ISession.SaveOrUpdate(object)方法

ISession.SaveOrUpdate(object)方法完成如下工作:

  • 检查这个对象是否已经存在Session中。
  • 如果对象不在,调用Save(object)来保存。
  • 如果对象存在,检查这个对象是否改变了。
  • 如果对象改变,调用Update(object)来更新。

看看下面例子说明了这种情况,在数据访问层编写SaveOrUpdateCustomer()方法,保存更新Customer对象列表,依次遍历列表中的Customer对象,调用ISession.SaveOrUpdate(object)方法保存更新每个Customer对象。

public void SaveOrUpdateCustomer(IList<Customer> customer)
{foreach (var c in customer) { _session.SaveOrUpdate(c); } _session.Flush(); }

测试这个方法,先在数据库中查询Firstname为YJing的Customer对象并修改它的Lastname属性值,这些对象是数据库中存在的,并改变了,然后新建2个Customer对象,这两个对象在数据库中不存在,是新创建的。调用SaveOrUpdateCustomer()方法保存更新对象,即更新前面修改的对象和保存了后面新创建的2个对象。再次查询数据库中Firstname为YJing,Lastname为YongJing的Customer对象是否一致了。

[Test]
public void SaveOrUpdateCustomerTest()
{IList<Customer> customers = _crud.GetCustomersByFirstname("YJing");foreach (var c in customers) { c.Lastname = "YongJing"; } var c1 = new Customer() { Firstname = "YJing", Lastname = "YongJing"}; var c2 = new Customer() { Firstname = "YJing", Lastname = "YongJing"}; customers.Add(c1); customers.Add(c2); int initiaIListCount = customers.Count; _crud.SaveOrUpdateCustomer(customers); int testListCount = _crud.GetCustomersByFirstnameAndLastname("YJing", "YongJing").Count; Assert.AreEqual(initiaIListCount, testListCount); }

结语

当然,这一节操纵对象操作,在NHibernate中涉及了对象的状态, 对象对一个特定的ISession来说,有三种状态分别是:瞬时(transient)对象、持久化(persistent)对象、游离(detached)对象。这一节没有说到了,以后在讨论Session的时候再介绍。

转载于:https://www.cnblogs.com/zhengwei-cq/p/7359665.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chromedriver : Saving to 安装卡住 解决

使用vue-cli脚手架的时候&#xff0c;经常会碰到chromedriver安装卡壳。 解决办法&#xff1a;设置源 yarn config set "chromedriver_cdnurl" "https://npm.taobao.org/mirrors/chromedriver"

前端学习(2539):节点类型

/*1[].slice.call(lis)*//*伪数组 */const lisdocument.getElementsByTagName(li)/*判断数组 false*/console.log(lis instanceof Array)/*打印第一个信息 歌谣2*/console.log(lis instanceof Array,lis[1].innerHTML)/*for each undefine*/console.log(lis instanceof Array…

JZOJ 8.15 B组总结

NO.1 平台 Description   Alice要搭建平台&#xff0c;平台不能漂在空气中&#xff0c;必须要有两根柱子支撑&#xff0c;具体地说&#xff0c;每个平台的两端必须由一根柱子支撑&#xff0c;柱子的另一端在地板或另一个平台上。   给你平台的放置位置&#xff08;如下左…

vux 修改 设置 主题 颜色

vux使用的预处理语言是less&#xff0c;使用变量对主题颜色进行管理&#xff0c;所以修改主题需要两步走。 1、在src目录下面创建style/theme.less文件。内容如下 zPrimaryColor:#01428C;header-background-color:zPrimaryColor; 2、在build/webpack.base.conf.js文末加上一…

g2o求解BA 第10章

1、g2o_bal_class.h1.1 projection.hg2o还是用图模型和边&#xff0c;顶点就是相机和路标&#xff0c;边就是观测&#xff0c;就是像素坐标。只不过这里的相机是由旋转&#xff08;3个参数&#xff0c;轴角形式&#xff0c;就是theta*nx,theta*ny,theta*ny),位移(3个参数&#…

宝塔面板 Windows 2012 R2 使用指南(在更新中)

第一次使用Windows系统服务器 1、安装宝塔Windows面板 For 2012 R2镜像。 从镜像市场选择 输入宝塔Windows面板 For 2012 R2进行选择&#xff0c;点击使用。 设置密码 2、使用windows电脑进行远程桌面连接

支付宝当面付接口如何计算优惠

支付宝当面付官方接口文档&#xff1a;https://docs.open.alipay.com/194/105170/ 在弄清楚如何计算优惠之前先了解下相关金额参数&#xff1a; 1、请求中金额参数total_amount&#xff1a;订单总金额&#xff0c;订单总金额&#xff0c;单位为元&#xff0c;精确到小数点后两位…

微信 公众号 JS接口安全域名 是啥 什么意思

在微信开发时&#xff0c;需要点击【公众号设置】→【功能设置】→【JS接口安全域名】填写自己的访问域名。 因为微信的安全做得比较好&#xff0c;我们根据 微信 js sdk写的函数、方法&#xff0c;只有在指定的安全域名下才能被微信唤起。 注意&#xff1a;设置完安全域后&am…

oracle知识博客链接

http://blog.csdn.net/YiQiJinBu/article/category/1100395/1 转载于:https://www.cnblogs.com/fushou/p/7387964.html

sign check fail: check Sign and Data Fail解决方案

我们先看一下类似的错误信息如下&#xff1a; com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail这里着重说明&#xff0c;报这个错误是因为支付宝公钥&#xff08;alipay_public_key&#xff09;使用错误导致的&#xff01; 很多开发者把自己生成…

js 判断 浏览器 是否为 微信 浏览器

//判断是否是微信浏览器的函数 function isWeiXin(){var ua window.navigator.userAgent.toLowerCase();if(ua.match(/MicroMessenger/i) micromessenger){return true;}else{return false;} } isWeiXin()

kafka 常用命令汇总

启动 kafka 服务 # 使用 -daemon 选项表示后台运行kafka服务 ./kafka-server-start.sh -daemon ../config/server.properties 创建主题 ./kafka-topics.sh --create --zookeeper zk_host:port --replication-factor 1 --partitions 1 --topic topic_name 列举所有主题 ./kafka-…

支付宝接口报错 insufficient-isv-permissions 错误原因: ISV权限不足解决方案

原贴地址&#xff1a;https://openclub.alipay.com/read.php?tid1672&fid72&#xff0c;欢迎大家访问错误信息一般如下&#xff1a; 错误代码 insufficient-isv-permissions 错误原因: ISV权限不足错误原因&#xff1a; 1.应用未上线 2.正式环境和沙箱环境网关使用…

Luogu P1115 最大子段和(dp 贪心)

P1115 最大子段和 题目描述 给出一段序列&#xff0c;选出其中连续且非空的一段使得这段和最大。 输入输出格式 输入格式&#xff1a; 输入文件maxsum1.in的第一行是一个正整数N&#xff0c;表示了序列的长度。 第2行包含N个绝对值不大于10000的整数A[i]&#xff0c;描述了这段…

微信 手机 网站 开发 签名 signature node (在更新中)

在进行微信手机网站开发时&#xff0c;第一座大山就是获取签名。下面是微信JS-SDK开发文档的内容&#xff0c;本文主要理清思路&#xff0c;开发起来&#xff0c;就很快了。 wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来&#xff0c;若…

无效的appid排查方案

原贴地址&#xff1a;https://openclub.alipay.com/read.php?tid1909&fid72&ant_sourcezsearch&#xff0c;欢迎大家访问 报错信息一般如下&#xff1a; {"code":"40002","msg":"Invalid Arguments","sub_code":&q…

微信 IP白名单

买了周杰伦演唱会的门票才能去周杰伦演唱会听歌。在微信开发中获取access_token也是讲得同一个道理。我们首先需要设置微信的IP白名单。 点击查看即可配置。

教你设置eclipse自动生成的author等注释

每新建一个类上面都会有一行注释&#xff1a; /*** author 颠覆白的黑* version 创建时间&#xff1a;2018年3月26日 下午5:29:31* 类说明 */操作步骤和大家分享一下&#xff1a; window&#xff0d;>preference&#xff0d;>java&#xff0d;>code styple&#xff0…

前端学习(2546):debugger

执行进行数据代理 变量存储了一下 加入断点