NHibernate Step by Step (一) Hello,NHibernate!
好了,今天我們正式開(kāi)始NHibernate的歷程,在第一次的練習(xí)中,我將盡量詳細(xì)地講解環(huán)境的配置,以后將不再詳細(xì)解釋。
基本的軟件環(huán)境如下:
1.NHibernate
www.nhibernate.org
當(dāng)前版本是1.0.2
2.Code Smith
http://www.codesmithtools.com/
3.NHibernate模板
點(diǎn)擊這里下載
當(dāng)然,少不了VS2005跟SQLServer了,我這里用的是SQLServer2005,教程用在SQLServer2000上應(yīng)該沒(méi)有問(wèn)題,默認(rèn)情況下,我將建立并使用一個(gè)叫NHibernate的數(shù)據(jù)庫(kù)。
首先,我們先建立一個(gè)最簡(jiǎn)單的Person表,如下完整腳本(你可以進(jìn)行修改以適合自己的數(shù)據(jù)庫(kù)):




















僅有兩個(gè)字段,一個(gè)自動(dòng)增長(zhǎng)的id,一個(gè)name,如下:
然后將下載的nhibernate-template解壓,打開(kāi)Code Smith,將模板加入”Template Explorer”,如下:
然后在其中的NHibernate.cst上點(diǎn)右鍵,選擇“Execute”,彈出設(shè)置窗口,在左邊的屬性窗口進(jìn)行如下設(shè)置:
注 意:SourceDatabase屬性在第一次選擇時(shí)需要配置一個(gè)連接字符串,配置好后Code Smith將記錄下來(lái)。 Assembly屬性代表的是生成文件的默認(rèn)Assembly名,而NameSpace,顧名思義,就是使用的命名空間了,這里我們?nèi)渴褂谩?Test.Model”,請(qǐng)記住這個(gè)名字,點(diǎn)擊左下角的Generate,將會(huì)在指定的輸出目錄下產(chǎn)生兩個(gè)文件:Person.cs, Person.hbm.xml。
好了,NHibernate需要的類文件和映射文件生成完了,我們可以開(kāi)始干活了!(生成NHibernate文件均是如此步驟,以后不再贅述)
新建立一個(gè)類庫(kù)工程,為了簡(jiǎn)潔起見(jiàn),我們命名為Model,需要注意的是,為了跟剛才生成的文件對(duì)應(yīng),我們需要在Model工程的屬性頁(yè)中將起Assembly名字設(shè)為上面的“Test.Model”,如下:
然 后將剛才生成的兩個(gè)文件Person.cs和Person.hbm.xml加入到Model工程中來(lái),選中Person.hbm.xml文件,在屬性窗口 中將其“Build Action”設(shè)置為“Embedded Resource”(這是非常重要的一步,否則NHibernate將無(wú)法找到映射文件),如下:
build,ok,通過(guò)。
然后建立一個(gè)控制臺(tái)工程,命名為Console1,添加NHibernate和上面Model項(xiàng)目的引用,另外添加一個(gè)應(yīng)用程序配置文件,如下:

















然后編寫(xiě)如下代碼:




































運(yùn)行,ok,執(zhí)行成功!!
我們到數(shù)據(jù)庫(kù)檢查一下,如下:
我們想要添加的記錄已經(jīng)成功加入到數(shù)據(jù)庫(kù)中!!
是不是感覺(jué)有些神奇啊?好,我們開(kāi)始詳細(xì)解釋。
先來(lái)看生成的兩個(gè)文件,第一個(gè)是Person.cs,如下:








你可以發(fā)現(xiàn),這完全是一個(gè)普通的poco類(Plain Old CLR Object),僅僅是對(duì)數(shù)據(jù)庫(kù)person表的一個(gè)完全映射,不依賴于任何框架,可以用來(lái)作為持久化類,你可以在任何地方使用而不用擔(dān)心依賴于某些神秘的運(yùn)行時(shí)東西。
另 外,NHibernate需要知道怎樣去加載(load)和存儲(chǔ)(store)持久化類的對(duì)象。這正是NHibernate映射文件發(fā)揮作用的地方。映射 文件告訴NHibernate它應(yīng)該訪問(wèn)數(shù)據(jù)庫(kù)(database)里面的哪個(gè)表(table)及應(yīng)該使用表里面的哪些字段(column),這就是我們 今天要講的重點(diǎn)了,Person.hbm.xml,如下:













不用說(shuō),最頂層的hibernate-mapping節(jié)點(diǎn)是NHibernate用來(lái)進(jìn)行映射的根了,其中,包含一個(gè)class節(jié)點(diǎn),里面的name屬性對(duì)應(yīng)我們的Person類,注意,需要完整的限定名;而table屬性,則顯而易見(jiàn)是對(duì)應(yīng)數(shù)據(jù)庫(kù)中的Person表了。
我 們?cè)偻锩婵矗謩e有兩個(gè)節(jié)點(diǎn),一個(gè)是id,對(duì)應(yīng)數(shù)據(jù)庫(kù)中的id,一個(gè)是屬性name,對(duì)應(yīng)表中的column name和Person類中的name屬性,整個(gè)映射文件簡(jiǎn)捷明了,一看即知。實(shí)際上這是由代碼產(chǎn)生工具產(chǎn)生的映射文件,里面很多東西我們其實(shí)可以省略, 如下寫(xiě)法:
<property name=”Name” column=”name” />
NHibernate將自動(dòng)去匹配數(shù)據(jù)庫(kù)中的列而不需要我們來(lái)設(shè)置。
下面,我們來(lái)看一下應(yīng)用程序配置文件中都記錄了那些東西,如下:
hibernate.connection.provider_class
定制IConnectionProvider的類型.
例 如:full.classname.of.ConnectionProvider (如果提供者創(chuàng)建在NHibernate中), 或者 full.classname.of.ConnectionProvider, assembly (如果使用一個(gè)自定義的IConnectionProvider接口的實(shí)現(xiàn),它不屬于NHibernate)。
hibernate.connection.driver_class
定制IDriver的類型.
full.classname.of.Driver (如果驅(qū)動(dòng)類創(chuàng)建在NHibernate中), 或者 full.classname.of.Driver, assembly (如果使用一個(gè)自定義IDriver接口的實(shí)現(xiàn),它不屬于NHibernate)。
hibernate.connection.connection_string
用來(lái)獲得連接的連接字符串.
hibernate.connection.isolation
設(shè)置事務(wù)隔離級(jí)別. 請(qǐng)檢查 System.Data.IsolationLevel 來(lái)得到取值的具體意義并且查看數(shù)據(jù)庫(kù)文檔以確保級(jí)別是被支持的。
例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified
hibernate.dialect
NHibernate方言(Dialect)的類名 - 可以讓NHibernate使用某些特定的數(shù)據(jù)庫(kù)平臺(tái)的特性
例如: full.classname.of.Dialect(如果方言創(chuàng)建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一個(gè)自定義的方言的實(shí)現(xiàn),它不屬于NHibernate)。
接著,我們開(kāi)始解釋代碼的執(zhí)行,如下:




























現(xiàn)在有了一個(gè)基本的概念了吧??
好了,第一篇就講這么多,我們下次再接著練習(xí)。
Step by Step,顧名思義,是一步一步來(lái)的意思,整個(gè)教程我將貫徹這一理念,待此系列結(jié)束后,我們?cè)倬湍承└呒?jí)話題進(jìn)行深入。
任何建議或者批評(píng),請(qǐng)e: abluedog@163.com
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
