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/
本文以學習、研究和分享為主,版權歸作者和博客園共有,歡迎轉載,但必須在文章頁面明顯位置給出此段申明。