1.0=>前言
放着好好的EF不用,为什么要来玩NHibernate了?那是因为现在的工作内容就是维护一个比较老的项目,第一版是公司找外包做的,跟数据库打交道这块用的NHibernate,虽然都是ORM,但是既然维护这个项目有一段时间要一直搞,那还是趁着周末休息的时间先自己玩玩NHibernate,提前熟悉下.
什么是NHibernate:
1.开源的ORM(对象关系映射)框架.ORM可以被认为是,基于关系型数据库的数据存储,实现一个虚拟的面向对象的数据访问接口。理想情况下,基于这样一个面向对象的接口,持久化一个OO对象应该不需要要了解任何关系型数据库存储数据的实现细节。
2.简化数据库操作的开发.功能 : 将 .Net实体对象 直接持久化 到数据库.
在ADO.NET基础上进行封装,只需要少量代码就可以完成持久化工作,通过映射文件保存映射信息,在业务层以面向对象的方式编程,不用考虑数据保存形式
2.0=>使用Hibernate的"3个准备,7个步骤"
a-添加程序集;
b-配置文件;
c-添加实体类和实体配置文件;
1 public class NHibernateHelper 2 { 3 private static ISessionFactory _sessionFactory; 4 private static object _myLocker = new object(); 5 private static ISessionFactory SessionFactory 6 { 7 get 8 { 9 if (_sessionFactory == null) 10 { 11 lock (_myLocker) 12 { 13 if (_sessionFactory == null) 14 { 15 _sessionFactory = new Configuration().Configure("NHibernateConfiguration/NHibernate.cfg.xml").BuildSessionFactory(); 16 } 17 } 18 } 19 return _sessionFactory; 20 } 21 } 22 public static ISession OpenSession() 23 { 24 try 25 { 26 return SessionFactory.OpenSession(); 27 } 28 catch (Exception ex) 29 { 30 31 return null; 32 } 33 34 } 35 36 }
创建 会话(非共享使用,非线程安全,但是如果针对当前请求里的每个数据库操作都创建 会话,则极度浪费资源,所以,最好是 针对每次请求 只创建一个 会话,后面从当前上下文里面直接取,本次demo还是每次都直接开启一个了)
ISession sess = SessionFactory.OpenSession();
HttpContext.Current.Items.Add("nfsession", sess);
3.0=>ISession的几个主要方法
1 //1.创建工厂 2 using (ISessionFactory fac = new Configuration().Configure().BuildSessionFactory()) 3 { 4 //2.创建会话 5 using (ISession sess = fac.OpenSession()) 6 { 7 //3.开启事务 (此时,sess对象已经被传入到tran对象中了,所以当commit的时候,就可以 调用到此sess的Flush方法) 8 using (ITransaction tran = sess.BeginTransaction()) 9 { 10 //构造要删除的 对象 11 Classes model = new Classes() { CID = int.Parse(strId) }; 12 //删除 13 sess.Delete(model); 14 //提交事务 15 tran.Commit(); 16 context.Response.Write("删除成功!"); 17 } 18 } 19 }
开启事务 (此时,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/
本文以学习、研究和分享为主,版权归作者和博客园共有,欢迎转载,但必须在文章页面明显位置给出此段申明。