1.0=>前言

放着好好的EF不用,为什么要来玩NHibernate了?那是因为现在的工作内容就是维护一个比较老的项目,第一版是公司找外包做的,跟数据库打交道这块用的NHibernate,虽然都是ORM,但是既然维护这个项目有一段时间要一直搞,那还是趁着周末休息的时间先自己玩玩NHibernate,提前熟悉下.

什么是NHibernate:

1.开源的ORM(对象关系映射)框架.ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要要了解任何关系型数据库存储数据的实现细节。

2.简化数据库操作的开发.功能 : 将 .Net实体对象 直接持久化 到数据库.

在ADO.NET基础上进行封装,只需要少量代码就可以完成持久化工作,通过映射文件保存映射信息,在业务层以面向对象的方式编程,不用考虑数据保存形式

2.0=>使用Hibernate的"3个准备,7个步骤"

一.=> 3个准备 :
      a-添加程序集;
      b-配置文件;
      c-添加实体类和实体配置文件;
添加程序集:你可以去https://sourceforge.net/projects/nhibernate/下载程序集也可以用Nuget,咱们这里直接用Nuget安装
配置文件:无论你是自己下的还是用Nuget安装的都会有ConfigurationTemplates文件夹,找到MSSQL.cfg.xml复制一份作为你项目的NHibernate的配置文件,当项目使用很多框架的时候可能配置文件很多这个时候可以建一个配置文件的文件夹
添加实体类和实体配置文件:本次Demo是用的动软代码生成器生成的,当然了你也可以用其他的生成器比如MyGeneration之类的,这个不是重点
下面是本次小Demo的项目一览图(代码下载:NHibernate.rar数据库就采用NHibernate开源项目提供的示例数据库)
二.=>7个步骤 : 
 
当然了第一二步骤每次都写一次多么麻烦,所以这里我假如了一个NHibernateHelper,
  public class NHibernateHelper
{
private static ISessionFactory _sessionFactory;
private static object _myLocker = new object();
private static ISessionFactory SessionFactory
{
get
{
if (_sessionFactory == null)
{
lock (_myLocker)
{
if (_sessionFactory == null)
{
_sessionFactory = new Configuration().Configure("NHibernateConfiguration/NHibernate.cfg.xml").BuildSessionFactory();
}
}
}
return _sessionFactory;
}
}
public static ISession OpenSession()
{
try
{
return SessionFactory.OpenSession();
}
catch (Exception ex)
{ return null;
} } }
SessionFactory是可以被共享使用的, 是线程安全的

创建 会话(非共享使用,非线程安全,但是如果针对当前请求里的每个数据库操作都创建 会话,则极度浪费资源,所以,最好是 针对每次请求 只创建一个 会话,后面从当前上下文里面直接取,本次demo还是每次都直接开启一个了)
ISession sess = SessionFactory.OpenSession();
HttpContext.Current.Items.Add("nfsession", sess);

3.0=>ISession的几个主要方法

1.Save ,Persist保存数据. 后者在事务外不会产生insert语句.
2.Delete删除对象
3.Update更新对象,如果数据库中没有记录,会出现异常
4.Get,根据id立即查询数据库
5.Load 根据id查(返回的是代理,不回立即访问数据库)
6.SaveOrUpdate,Merge(根据id和version的值来确定是Save或Update),调用Merge你的对象还是托管的.
7.Lock,把对象变成持久独享,但不会同步对象的状态.
 
这里强调下SaveOrUpdate这个方法,当把model传给方法的时候如果model指定主键id那么会去判断如果数据库有这个id对应的数据记录就会做Update操作,如果model没有指定主键id就做Save新增操作,当你不清楚你即将做什么操作的时候可以用这个方法,一般还是用Save和Update就足够.
另外说一下用ISession的时候可以用事务配合使用和可以不用事务,用事务的时候如果做的是批量操作有错误会回滚,反之不用事务没有回滚,如果你的数据操作逻辑比较多,就可以使用事务.

  //1.创建工厂
using (ISessionFactory fac = new Configuration().Configure().BuildSessionFactory())
{
//2.创建会话
using (ISession sess = fac.OpenSession())
{
//3.开启事务 (此时,sess对象已经被传入到tran对象中了,所以当commit的时候,就可以 调用到此sess的Flush方法)
using (ITransaction tran = sess.BeginTransaction())
{
//构造要删除的 对象
Classes model = new Classes() { CID = int.Parse(strId) };
//删除
sess.Delete(model);
//提交事务
tran.Commit();
context.Response.Write("删除成功!");
}
}
}

开启事务 (此时,sess对象已经被传入到tran对象中了,所以当commit的时候,就可以 调用到此sess的Flush方法)

4.0=>HQL和Criteria

HQL(Hibernate Query Language)
面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了C#类和属性其他部分不区分大小写);
HQL中查的是对象而不是表,并且支持多态;
HQL主要通过Query来操作,Query的创建方式:
IQuery
q = sess.CreateQuery(hql);
from Person
from User u where u.name=:name
from User u where u.name=:name and u.birthday<:birthday
l
Criteria
Criteria
是一种比HQL更面向对象的查询方式;
ICriteria
crit
= sess.CreateCriteria(typeof(User));
简单属性条件如:crit.Add(Restrictions.eq(proName,value));
crit.Add(Restrictions.eqProperty(proName,otherProName));

5.0=>NHibernate缓存

NHibernate一级缓存

即ISession缓存,属于事务级缓存,只能在ISession生命周期内使用.
1.每次查询数据结果会存储在此Isession中,关闭前做相同查询就直接获取,而不查数据库.
2.此缓存存在于各个ISession中,不同ISession对象的缓存不共享.
一级缓存操作方法:
1. ISession.Evict(object):删除指定实例
2. ISession.Clear():清空
3. ISession.Contains(object):检查是否包含指定实例
NHibernate二级缓存
由ISessionFactory维护,被所有ISession共享.
数据检索方式:先去一级缓存找,再到二级缓存找,如果都没有,才去数据库查询.
缓存使用原则:经常被访问,但修改次数少.

最后附上一个帮助文档:NHIBERNATE-符合.Net习惯的关系数据库持久化

文档里面很全面,基本看着帮助文档就可以自己玩起来了

如果觉得本文对你有所帮助不如【推荐】一下! 如果文中有不妥或者错误的地方还望指出,以免误人子弟。

作者:张一辉

出处:http://www.cnblogs.com/zhangyihui/

本文以学习、研究和分享为主,版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出此段申明。

不得不玩玩NHibernate的更多相关文章

  1. 一步步学习NHibernate(1)——NHibernate介绍

    请注明转载地址:http://www.cnblogs.com/arhat 第十五章 从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的 ...

  2. NHibernate:教你如何搭建数据访问层?

    NHibernate:教你如何搭建数据访问层? 什么是NHibernate NHibernate 是一个基于.net 的针对关系型数据库的对象持久化类库.NHibernate 来源于非常优秀的基于Ja ...

  3. NHibernate之映射文件配置说明

    NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...

  4. [Nhibernate]体系结构

    引言 在项目中也有用到过nhibernate但对nhibernate的认识,也存留在会用的阶段,从没深入的学习过,决定对nhibernate做一个系统的学习. ORM 对象-关系映射(OBJECT/R ...

  5. NHibernate中多表(对象)间的查询

    一个比较简单的查询代码如下:   IList userList=session.Find (" from testMSSql.student as student where student ...

  6. [转]NHibernate之映射文件配置说明

    1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...

  7. 瞎折腾之 NHibernate ORM框架的接触(MVC + Repository源码)(一)

    在这炮火连天.技术更新迅猛的年代,不接触了解.甚至会用2~3种框架都不好意思说自己有多少年工作经验.况且出去面试也会有点吹牛的底子嘛. 这次折腾了NHibernate.其实这些ORM框架封装好了都是给 ...

  8. Spring.NET 与 NHibernate

    回到 Spring.NET & NHibernate of C#.NET 技术论坛 实战C#.NET编程----Spring.NET & NHibernate从入门到精通 您可以从以下 ...

  9. 【转】NHibernate入门教程

    开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 摘要: 热衷于开源框架探索的我发现A ...

随机推荐

  1. 你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧

    目前SQL Server数据库作为微软一款优秀的RDBMS,其本身启动的时候是很少出问题的,我们在平时用的时候,很少关注起启动过程,或者很少了解其底层运行过程,大部分的过程只关注其内部的表.存储过程. ...

  2. 【转】总结:2015这一年App Store审核指南都有哪些变化

    本文针对此前版本的<App Store审核指南>进行了更新,并标注了2015年苹果对<App Store审核指南>进行的一些调整. App Store Review Guide ...

  3. 设计模式C#实现(十一)——组合模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 意图 将对象组合成树形结构以表示“部分-整体”的层次结构.Composite使得用户对单个对象和组合对象的使用具有一致性. 适用性 你想表示对象的部 ...

  4. asp.net 后台 Http POST请求

    时间忙,简单些,直接贴代码上图 百度站长平台为站长提供链接提交通道,您可以提交想被百度收录的链接,百度搜索引擎会按照标准处理 http://zhanzhang.baidu.com/linksubmit ...

  5. 工作中常用的Linux命令:mkdir命令

    本文链接:http://www.cnblogs.com/MartinChentf/p/6076075.html (转载请注明出处) 在Linux系统中,mkdir命令用来创建一个目录或一个级联目录. ...

  6. Android之drawable state各个属性详解

    android:drawable 放一个drawable资源android:state_pressed 是否按下,如一个按钮触摸或者点击.android:state_focused 是否取得焦点,比如 ...

  7. ES6函数默认参数(Default Parameters)

    语言更新时每一个新增的特性都是从千百万开发者需求里提取过来的,规范采用后能减少程序员的痛苦,带来便捷. 我们经常会这么写 function calc(x, y) { x = x || 0; y = y ...

  8. 【原】js实现复制到剪贴板功能,兼容所有浏览器

    两天前听了一个H5的分享,会议上有一句话,非常有感触:不是你不能,而是你对自己的要求太低.很简单的一句话,相信很多事情不是大家做不到,真的是对自己的要求太低,如果对自己要求多一点,那么你取得的进步可能 ...

  9. Vim 命令整理

    1. 文件命令 2. 模式切换 3. 移动命令 4. 书签命令 5. 修改命令 6. 可视化操作 7. 区域选择 8. 宏命令 9. 分屏 10. 系统设置命令 1. 文件命令 [:]开始的命令需要输 ...

  10. 网格弹簧质点系统模拟(Spring-Mass System by Euler Integration)

    弹簧质点模型是利用牛顿运动定律来模拟物体变形的方法.如下图所示,该模型是一个由m×n个虚拟质点组成的网格,质点之间用无质量的.自然长度不为零的弹簧连接.其连接关系有以下三种: 1.连接质点[i, j] ...