C#—Nhibernate探索 本篇文章,讓我們一起來探索Nhibernate。 首先我們去搜索Nhibernate下載地址,如下鏈接所示。 該版本可能是最新版,我下載的4.0.4.GA。其中GA意思我沒搞清楚。不過應該不重要。 https://sourceforge.net/projects/nh ...
C#—Nhibernate探索
本篇文章,讓我們一起來探索Nhibernate。
首先我們去搜索Nhibernate下載地址,如下鏈接所示。
該版本可能是最新版,我下載的4.0.4.GA。其中GA意思我沒搞清楚。不過應該不重要。
https://sourceforge.net/projects/nhibernate/
分析文件內容
下載完成後,解壓縮,我們看到文件夾內容如下圖所示。
我們可以分析得出,其中Required_Bins存儲的是類庫和其他資源;字面的意思Required,是必須文件。
打開Required文件夾,我們看到裡面是這樣的。
這裡有兩個類庫;可以分析得出,這兩個類庫是要被引用的。
類庫擁有對應的XML,沒找到具體使用該XML的方法。所以暫時不去理他。
NHibernate.pdb應該是沒有用的。估計是作者忘記刪除了。
nhibernate-configuration.xsd和nhibernate-mapping.xsd兩個文件暫時不知道要乾什麼用的。
但看到.xsd文件,第一時間反應,他們應該是用來幫助開發者,快速生成配置文件用的。為了保險起見,我們上網查詢一下。
查詢結果:
查詢結果是,他們倆是【文件智能提示功能】用的。
且nhibernate-configuration.xsd和nhibernate-mapping.xsd是要放到c盤的,路徑如下:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas
因為是我用的是vs2012,所以,我找的路徑是Microsoft Visual Studio 11.0。並將文件放在了那裡面。
雖然感覺,這倆文件好像不是這麼用的,但由於可以判斷它們並不影響程式運行,所以,先且不管他們,等程式運行起來後,再刪除他們試試。
再之後,我上網調查了下Nhibernate的應用。
上網調查後,發現Nhibernate有Castle框架、LinFu框架、Spring.Net三種。
看起來很複雜,文章有很多,寫的又很複雜,於是我放棄調查,直接嘗試使用,首先第一步,直接引用類庫。
一、建立了一個類庫程式,引用Iesi.Collections.dll和NHibernate.dll兩個DLL。
接下來,我們開始建立持久化對象。
public class Test { public virtual int Id { get; set; } public virtual string Name { get; set; } }
接下來建立持久化對象與資料庫的映射。再次上網調查。
調查結果:
對象與資料庫的映射是保存在XML文件中的,於是我配置XML映射文件如下。
該XML文件的屬性,要求設置其生成操作為【嵌入的資源】。
但我怕它丟失,還給他設置了始終複製的屬性。
XML文件如下:
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NherbinateHelper" namespace="NherbinateHelper"> <class name ="Test"> <id name="Id" column ="Id"> <generator class ="native"/> </id> <property name ="Name"/> </class> </hibernate-mapping>
再然後,我需要建立資料庫連接的類。
再次上網調查。編寫NHibernateHelper如下。
public class NHibernateHelper { private ISessionFactory _sessionFactory; public NHibernateHelper() { _sessionFactory = GetSessionFactory(); } private ISessionFactory GetSessionFactory() { return (new Configuration()).Configure().BuildSessionFactory(); } public ISession GetSession() { return _sessionFactory.OpenSession(); } }
因為我們沒有顯示設置資料庫連接字元串,所以,如果程式可以運行,那麼這個類,一定會讀配置文件中SQL字元串連接。
然後,我們建立domain(域),添加對Text持久化對象的增刪改查的方法。
public class NHibernateSample { protected ISession Session { get; set; } public NHibernateSample(ISession session) { Session = session; } public void CreateCustomer(Test test) { Session.Save(test); Session.Flush(); } public Test GetCustomerById(int Id) { return Session.Get<Test>(Id); } }
再然後,我們新建一個控制台程式,用於測試我們編寫的這個NHibernate,是否可以正常運行。
編寫測試類代碼如下。
public class NHibernateSampleFixture { private NHibernateSample _sample; public NHibernateSampleFixture() { _sample = new NHibernateSample(new NHibernateHelper().GetSession()); } public void GetCustomerByIdTest() { var tempCutomer = new Test { Name = "李" }; _sample.CreateCustomer(tempCutomer); Test customer = _sample.GetCustomerById(1); int customerId = customer.Id; } }
main函數調用如下:
class Program { static void Main(string[] args) { NHibernateSampleFixture f = new NHibernateSampleFixture(); f.GetCustomerByIdTest(); } }
測試結果是失敗,因為,我們還沒有在任何地方設置資料庫連接字元串。所以推斷,缺少了配置資料庫連接的文件。
接著,我打開文件夾了Configuration_Templates。
發現Configuration_Templates文件夾下有如下文件。
我推斷,這裡就是資料庫連接字元串的模板。
由於我使用的資料庫是sqlserver,所以,我複製了mssql.cfg.xml。
然後將複製的文件,黏貼到測試的控制台程式下,然後改名為《hibernate.cfg.xml》。
這裡測試了下,貌似不改名不好使,配置文件內容如下
【PS:我始終沒搞懂,XML中的CFG代表什麼意思。】
<?xml version="1.0" encoding="utf-8"?> <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" > <session-factory name="NHibernate.Test"> <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property> <property name="connection.connection_string"> Server=SKY-20160718RXO\SA;initial catalog=Nherbinate;Integrated Security=SSPI; </property> <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property> <mapping assembly="NherbinateHelper"/> </session-factory> </hibernate-configuration>
因為我連接的是sqlserver2012,所以配置文件里,我將原始版SQL2008的property 修改為
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
註意
其中<mapping assembly="NherbinateHelper"/>是後加的,原文件里沒有。
這句話的意思是,映射我創建的那個類庫。
我推斷,Nherbinate是讀這個配置文件,然後到這個程式集里,反射查詢那些poco對象。
最後,nhibernate-configuration-2.2這句話我想了很久要不要改成4.0。
結果是我沒改,測試一切正常。可以順利使用。
結語
這是一場Nhibernate探索之旅,結果是非常順利的配置成功了。共耗時2小時。
為什麼說是探索之旅呢,因為,我也是首次配置Nhibernate,我平常更多的是使用Entity Framework。
文中使用了一些推斷,猜測的詞語。那是因為,真的是在推斷的。我並不清楚那幾個點的原理和含義,因為我沒看Nhibernate的原代碼。
雖然本文是講述,配置Nhibernate;但我更想講述的是,面對未知的框架入手學習和使用的方法。
我描述了自身一步一步配置Nhibernate的路徑,我覺得還算高效,大家也可以效仿,用來學習陌生框架。
當然不必太追求速度,因為每個人的基礎不一樣。我比較熟悉Entity Framework。所以學習Nhibernate就會比較快。
如果你還沒接觸過ORM,那自然就會慢一點。
----------------------------------------------------------------------------------------------------
註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!