不得不玩玩NHibernate
1.0=>前言
放着好好的EF不用,为什么要来玩NHibernate了?那是因为现在的工作内容就是维护一个比较老的项目,第一版是公司找外包做的,跟数据库打交道这块用的NHibernate,虽然都是ORM,但是既然维护这个项目有一段时间要一直搞,那还是趁着周末休息的时间先自己玩玩NHibernate,提前熟悉下.
什么是NHibernate:
1.开源的ORM(对象关系映射)框架.ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要要了解任何关系型数据库存储数据的实现细节。
2.简化数据库操作的开发.功能 : 将 .Net实体对象 直接持久化 到数据库.
在ADO.NET基础上进行封装,只需要少量代码就可以完成持久化工作,通过映射文件保存映射信息,在业务层以面向对象的方式编程,不用考虑数据保存形式
2.0=>使用Hibernate的"3个准备,7个步骤"
a-添加程序集;
b-配置文件;
c-添加实体类和实体配置文件;


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;
} } }
创建 会话(非共享使用,非线程安全,但是如果针对当前请求里的每个数据库操作都创建 会话,则极度浪费资源,所以,最好是 针对每次请求 只创建一个 会话,后面从当前上下文里面直接取,本次demo还是每次都直接开启一个了)
ISession sess = SessionFactory.OpenSession();
HttpContext.Current.Items.Add("nfsession", sess);
3.0=>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
面向对象的查询语言,与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
Criteria
是一种比HQL更面向对象的查询方式;
ICriteria
crit
= sess.CreateCriteria(typeof(User));
简单属性条件如:crit.Add(Restrictions.eq(proName,value));
crit.Add(Restrictions.eqProperty(proName,otherProName));
5.0=>NHibernate缓存
NHibernate一级缓存
1.每次查询数据结果会存储在此Isession中,关闭前做相同查询就直接获取,而不查数据库.
2.此缓存存在于各个ISession中,不同ISession对象的缓存不共享.
1. ISession.Evict(object):删除指定实例
2. ISession.Clear():清空
3. ISession.Contains(object):检查是否包含指定实例
最后附上一个帮助文档:NHIBERNATE-符合.Net习惯的关系数据库持久化

如果觉得本文对你有所帮助不如【推荐】一下! 如果文中有不妥或者错误的地方还望指出,以免误人子弟。
作者:张一辉
出处:http://www.cnblogs.com/zhangyihui/
本文以学习、研究和分享为主,版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出此段申明。
不得不玩玩NHibernate的更多相关文章
- 一步步学习NHibernate(1)——NHibernate介绍
请注明转载地址:http://www.cnblogs.com/arhat 第十五章 从本章开始,老魏将给大家一起学习NHibernate这个流行的ORM框架,本来老魏想要和大家一起探讨微软的EF框架的 ...
- NHibernate:教你如何搭建数据访问层?
NHibernate:教你如何搭建数据访问层? 什么是NHibernate NHibernate 是一个基于.net 的针对关系型数据库的对象持久化类库.NHibernate 来源于非常优秀的基于Ja ...
- NHibernate之映射文件配置说明
NHibernate之映射文件配置说明 1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表 ...
- [Nhibernate]体系结构
引言 在项目中也有用到过nhibernate但对nhibernate的认识,也存留在会用的阶段,从没深入的学习过,决定对nhibernate做一个系统的学习. ORM 对象-关系映射(OBJECT/R ...
- NHibernate中多表(对象)间的查询
一个比较简单的查询代码如下: IList userList=session.Find (" from testMSSql.student as student where student ...
- [转]NHibernate之映射文件配置说明
1. hibernate-mapping 这个元素包括以下可选的属性.schema属性,指明了这个映射所引用的表所在的schema名称.假若指定了这个属性, 表名会加上所指定的schema的名字扩展为 ...
- 瞎折腾之 NHibernate ORM框架的接触(MVC + Repository源码)(一)
在这炮火连天.技术更新迅猛的年代,不接触了解.甚至会用2~3种框架都不好意思说自己有多少年工作经验.况且出去面试也会有点吹牛的底子嘛. 这次折腾了NHibernate.其实这些ORM框架封装好了都是给 ...
- Spring.NET 与 NHibernate
回到 Spring.NET & NHibernate of C#.NET 技术论坛 实战C#.NET编程----Spring.NET & NHibernate从入门到精通 您可以从以下 ...
- 【转】NHibernate入门教程
开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo 摘要: 热衷于开源框架探索的我发现A ...
随机推荐
- android双击返回键退出程序的实现
/** * 菜单.返回键响应 */ @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-gen ...
- Spring源码阅读系列总结
最近一段时间,粗略的查看了一下Spring源码,对Spring的两大核心和Spring的组件有了更深入的了解.同时在学习Spring源码时,得了解一些设计模式,不然阅读源码还是有一定难度的,所以一些重 ...
- HTTPS那些事(二)SSL证书
转自:http://www.guokr.com/post/116169/ 从第一部分HTTPS原理中, 我们可以了解到HTTPS核心的一个部分是数据传输之前的握手,握手过程中确定了数据加密的密码.在握 ...
- Java虚拟机 - 内存模型
本文主要介绍Java虚拟机的内存分布以及对象的创建过程. 一.Java虚拟机的内存分布 文章开始前读者需要了解Java虚拟机的运行时数据区是怎样划分的.如下图所示: 1.程序计数器(Program C ...
- react native windows开发环境搭建(一)
ReactNative分为服务器端和手机端loader程序,Android版有3种代码:js代码,java代码和c++代码,主要是编写的是js代码,如果框架功能不足就需要编写原生的java代码来扩展, ...
- linux 中/proc 详解
proc 文件系统 在Linux中有额外的机制可以为内核和内核模块将信息发送给进程-- /proc 文件系统.最初设计的目的是允许更方便的对进程信息进行访问(因此得名),现在它被每一个有有趣的东西报告 ...
- QT5.5.0版本添加icon图标步骤
1.制作icon图标文件 可以进入这个网站在线制作:http://www.ico.la/ 2.创建资源文件:qrc文件 接着 添加2两项,先点击prefix,然后添加文件--->图标路径 3.可 ...
- S5PV210的内存分配研究分析
S5PV210内存一般会使用SDRAM和DDR2 (DDR SDRAM),SDRAM的uboot启动网络已经有很多资料的,对于DDR2还有有很多疑惑,如果有错误的地方,请大家一定指出,醍醐灌顶,不胜感 ...
- dba诊断之IO
--查看占用系统io较大的session SELECT se.sid,se.serial#,pr.SPID,se.username,se.status,se.terminal,se.program ...
- JS读取写入删除COOKIE的各种操作
1. .NET后置代码中获取 Response.Redirect("http://www.baidu.com?id=" +Request.Cookies["size&qu ...