经过一段时间的学习对于NHibernate有一定的了解,这里记录一下,也分享给更多的人,
首先是一个代码起手式
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
//获取一个ISession对象,放置在Using中这里可以自动销毁,方便管理 using (ISession _ISession = NHibernateHelp.GetCurrentSession()) { //创建事务代码块 using (var trantion = _ISession.BeginTransaction()) { try { //业务操作 //提交事务 trantion.Rollback(); } catch (Exception) { //回滚事务 trantion.Rollback(); //异常处理 throw; }finally{ //释放资源 trantion.Dispose(); } } }
接下来开始介绍,
一:配置文件 需要配置和数据库相关的属性
二:创建实体类和XML配置文件与数据中的表进行映射,注:XML以.hbm.xml为后缀名,其次属性中内容的值应为:嵌入的资源,
三:实际操作:
3.1 添加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 添加用户 /// </summary> /// <param name="_ISession">ISession操作对象</param> private static void AddUser(ISession _ISession) { //创建一个要添加的对象 Users AddUser = new Users() { Users_Age = 18, Users_IsState = 1, Users_LoginName = "Jike", Users_LoginPwd = "Jike1234", Users_Name = "特朗普*杰克", Users_Roles = "user", Users_Sex = "男" }; //调用Save添加方法 //(1)种方法 有返回值 返回主键ID object类型 object AddUserID = _ISession.Save(AddUser); //(2)种方法 没有返回值 _ISession.Persist(AddUser); //判断添加成功后返回的键 if (AddUserID != null) { Console.WriteLine(string.Format("添加成功了!")); } else { Console.WriteLine(string.Format("添加失败了!")); } }
3.2 修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 修改用户 /// </summary> /// <param name="_ISession">ISession操作对象</param> private static void UpdateUser(ISession _ISession) { //创建一个要修改的对象 Users UpdateUser = new Users() { Users_ID = 12, Users_Age = 18, Users_IsState = 1, Users_LoginName = "Jike", Users_LoginPwd = "Jike1234", Users_Name = "特朗普*杰克斯", Users_Roles = "user", Users_Sex = "男" }; //(1)显示调用Update方法进行修改 _ISession.Update(UpdateUser); //(2) NHibernate会自动跟踪对加载的对象任何修改 Users UpdateUsered = _ISession.Get<Users>(12); UpdateUser.Users_Name = "特朗普*杰克"; Console.WriteLine("修改成功了"); }
3.3 删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 删除特定的用户 /// </summary> /// <param name="_ISession">操作对象</param> public static void DeleteUser(ISession _ISession) { //删除对象 //(1)使用Get方法获取要删除的对象 Users DeteleUser = _ISession.Get<Users>(13); //(1)使用Load方法获取要删除的对象 //Users DeteleUser = _ISession.Load<Users>(14); //调用删除语句 _ISession.Delete(DeteleUser); Console.WriteLine("删除成功了"); }
3.4 查询
查询有三种语法:SQL HQL CreateCriteria条件查询
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
/// <summary> /// 删除商品订单 /// </summary> /// <param name="Orders_ID"></param> /// <returns></returns> public ActionResult DeteleOrder(string Orders_ID) { //验证参数 if (Orders_ID != null && Orders_ID != "") { //创建ISession对象 ISession _ISession = NHibernateHelp.GetCurrentSession(); //创建事务单元块 using (var trantion = _ISession.BeginTransaction()) { try { //修改集合对象 成功后返回数据1 若失败则会回滚 object Users = _ISession.CreateSQLQuery(string.Format("delete Orders where Orders_ID = '{0}';select 1 ", Orders_ID)).List<object>().FirstOrDefault(); //提交事务 trantion.Commit(); //返回首页 return Content("<script>window.location.href = '/Orders/Index'; alert('删除成功!!');</script>"); } catch (Exception ex) { //事务回滚 trantion.Rollback(); throw ex; } finally { //释放资源 trantion.Dispose(); } } } return Content("<script>window.location.href = '/Orders/Index'; alert('请选择要删除的对象?');</script>"); }
由于SQL的方式返回的是Object类型的所以在查询时可以配合CreateSQLQuery().AddEntity(typeof(类型))的方式,NHibernate会在返回数据的时候找到相应类型的配置文件将其和类的属性/变量一一对应,然后类的对象/集合
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
HQL的方式和SQL类似,使用时切记一点,你所操作的时类的对象而不是数据库的表
随后我上传一个项目的链接 在OrderNHibernate.Test 程序中就主要应用了CreateCriteria的方式
项目下载:https://pan.baidu.com/s/1skVl82h ,请直接点击下载,不要打开压缩包,会有广告好像。。。
另外我再帮助大家认识一下,监视数据流向 和生成的SQL语句,首先我们打开SQL SERVER 数据库找到菜单栏 工具 ---SQL SERVER Profiler,打开后出现如下界面
输入相应数据库连接 登陆
这个时候我们来运行一段代码 select * from Users
现在数据流中已经出现了对应的SQL语句,我们可以使用这个工具更好的学习,毕竟有些时候错误发生,我们不太容易看出来,但是使用这个工具至少可以把问题,风险排除于数据库之外