不得不玩玩NHibernate


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,
 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     }
View Code

 

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  //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

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習慣的關系數據庫持久化

文檔里面很全面,基本看着幫助文檔就可以自己玩起來了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM