NHibernate Step by Step (一) 转载
轉載于http://abluedog.cnblogs.com/archive/2006/04/15/375862.html
基本的軟件環境如下:
1.NHibernate?http://www.nhibernate.org/?
2.Code Smith?http://www.codesmithtools.com/
3.NHibernate模板 點擊這里下載
當然,少不了VS2005跟SQLServer了,我這里用的是SQLServer2005,教程用在SQLServer2000上應該沒有問題,默認情況下,我將建立并使用一個叫NHibernate的數據庫。
首先,我們先建立一個最簡單的Person表,如下完整腳本(你可以進行修改以適合自己的數據庫):
?
USE?[NHibernate]GO
SET?ANSI_NULLS?ON
GO
SET?QUOTED_IDENTIFIER?ON
GO
SET?ANSI_PADDING?ON
GO
CREATE?TABLE?[dbo].[Person](
????[id]?[int]?IDENTITY(1,1)?NOT?NULL,
????[name]?[varchar](50)?COLLATE?Chinese_PRC_CI_AS?NOT?NULL,
?CONSTRAINT?[PK_Person]?PRIMARY?KEY?CLUSTERED?
(
????[id]?ASC
)WITH?(IGNORE_DUP_KEY?=?OFF)?ON?[PRIMARY]
)?ON?[PRIMARY]
GO
SET?ANSI_PADDING?OFF
?
僅有兩個字段,一個自動增長的id,一個name,如下:
?
然后將下載的nhibernate-template解壓,打開Code Smith,將模板加入”Template Explorer”,如下:
?
然后在其中的NHibernate.cst上點右鍵,選擇“Execute”,彈出設置窗口,在左邊的屬性窗口進行如下設置:
?
注意:SourceDatabase屬性在第一次選擇時需要配置一個連接字符串,配置好后Code Smith將記錄下來。 Assembly屬性代表的是生成文件的默認Assembly名,而NameSpace,顧名思義,就是使用的命名空間了,這里我們全部使用”Test.Model”,請記住這個名字,點擊左下角的Generate,將會在指定的輸出目錄下產生兩個文件:Person.cs,Person.hbm.xml。
好了,NHibernate需要的類文件和映射文件生成完了,我們可以開始干活了!(生成NHibernate文件均是如此步驟,以后不再贅述)
新建立一個類庫工程,為了簡潔起見,我們命名為Model,需要注意的是,為了跟剛才生成的文件對應,我們需要在Model工程的屬性頁中將起Assembly名字設為上面的“Test.Model”,如下:
?
然后將剛才生成的兩個文件Person.cs和Person.hbm.xml加入到Model工程中來,選中Person.hbm.xml文件,在屬性窗口中將其“Build Action”設置為“Embedded Resource”(這是非常重要的一步,否則NHibernate將無法找到映射文件),如下:
?
build,ok,通過。
然后建立一個控制臺工程,命名為Console1,添加NHibernate和上面Model項目的引用,另外添加一個應用程序配置文件,如下:
?
<?xml?version="1.0"?encoding="utf-8"??><configuration>
??<configSections>
????<section?name="nhibernate"?type="System.Configuration.NameValueSectionHandler,?System,
????????????????????Version=1.0.5000.0,Culture=neutral,?PublicKeyToken=b77a5c561934e089"?/>
??</configSections>
??<nhibernate>
????<add?key="hibernate.connection.provider"?value="NHibernate.Connection.DriverConnectionProvider"?/>
????<add?key="hibernate.connection.driver_class"?value="NHibernate.Driver.SqlClientDriver"?/>
????<add?key="hibernate.connection.connection_string"?value="Server=localhost;Initial?Catalog=NHibernate;Integrated?Security=SSPI"?/>
????<add?key="hibernate.connection.isolation"?value="ReadCommitted"/>
????<add?key="hibernate.dialect"?value="NHibernate.Dialect.MsSql2000Dialect"?/>
??</nhibernate>
</configuration>
?
請注意這里,這是引入NHibernate1.0的配置文件.如下引用是NHibernate2.0應該用如下配置
NHibernate2.0配置如下:?
?
<configuration>??<!--?Add?this?element?-->
??<configSections>
????<section?name="hibernate-configuration"?type="NHibernate.Cfg.ConfigurationSectionHandler,?NHibernate"?/>
??</configSections>
??<!--?Add?this?element?-->
??<hibernate-configuration?xmlns="urn:nhibernate-configuration-2.2">
????<session-factory>
??????<property?name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
??????<property?name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
??????<property?name="connection.connection_string">Server=BOCO-Terry\DATA;initial?catalog=NHibernate;Integrated?Security=true</property>
????</session-factory>
??</hibernate-configuration>
??<!--?Leave?the?system.web?section?unchanged?-->
??<system.web>
??</system.web>
</configuration>
?
然后編寫如下代碼:
?
using?System;using?System.Collections.Generic;
using?System.Text;
using?NHibernate;
using?NHibernate.Cfg;
using?Test.Model;
namespace?Console1
{
????class?Program
????{
????????static?void?Main(string[]?args)
????????{
????????????Configuration?config?=?new?Configuration().AddAssembly("Test.Model");
????????????ISessionFactory?factory?=?config.BuildSessionFactory();
????????????ISession?session?=?factory.OpenSession();
????????????Person?person?=?new?Person();
????????????person.Name?=?"Jackie?Chan";
????????????ITransaction?trans?=?session.BeginTransaction();
????????????try
????????????{
????????????????session.Save(person);
????????????????trans.Commit();
????????????????Console.WriteLine("Insert?Success!");
????????????}
????????????catch?(Exception?ex)
????????????{
????????????????trans.Rollback();
????????????????Console.WriteLine(ex.Message);
????????????}
????????}
????}
}
?
運行,ok,執行成功!!
我們到數據庫檢查一下,如下:
?
我們想要添加的記錄已經成功加入到數據庫中!!
是不是感覺有些神奇啊?好,我們開始詳細解釋。
先來看生成的兩個文件,第一個是Person.cs,如下:
?
using?System;using?System.Collections;
namespace?Test.Model
{
????Person#region?Person
????/**////?<summary>
????///?Person?object?for?NHibernate?mapped?table?'Person'.
????///?</summary>
????public?class?Person
????{
????????Member?Variables#region?Member?Variables
????????
????????protected?int?_id;
????????protected?string?_name;
????????#endregion
????????Constructors#region?Constructors
????????public?Person()?{?}
????????public?Person(?string?name?)
????????{
????????????this._name?=?name;
????????}
????????#endregion
????????Public?Properties#region?Public?Properties
????????public?int?Id
????????{
????????????get?{return?_id;}
????????????set?{_id?=?value;}
????????}
????????public?string?Name
????????{
????????????get?{?return?_name;?}
????????????set
????????????{
????????????????if?(?value?!=?null?&&?value.Length?>?50)
????????????????????throw?new?ArgumentOutOfRangeException("Invalid?value?for?Name",?value,?value.ToString());
????????????????_name?=?value;
????????????}
????????}
????????
????????#endregion
????}
????#endregion
}
?
你可以發現,這完全是一個普通的poco類(Plain Old CLR Object),僅僅是對數據庫person表的一個完全映射,不依賴于任何框架,可以用來作為持久化類,你可以在任何地方使用而不用擔心依賴于某些神秘的運行時東西。
另外,NHibernate需要知道怎樣去加載(load)和存儲(store)持久化類的對象。這正是NHibernate映射文件發揮作用的地方。映射文件告訴NHibernate它應該訪問數據庫(database)里面的哪個表(table)及應該使用表里面的哪些字段(column),這就是我們今天要講的重點了,Person.hbm.xml,如下:
?
<?xml?version="1.0"?encoding="utf-8"??><hibernate-mapping?xmlns="urn:nhibernate-mapping-2.0">
?<class?name="Test.Model.Person,?Test.Model"?table="Person">
??<id?name="Id"?type="Int32"?unsaved-value="0">
???<column?name="id"?sql-type="int"?not-null="true"?unique="true"?index="PK_Person"/>
???<generator?class="native"?/>
??</id>
??<property?name="Name"?type="String">
???<column?name="name"?length="50"?sql-type="varchar"?not-null="true"/>
??</property>
?</class>
</hibernate-mapping>
?
不用說,最頂層的hibernate-mapping節點是NHibernate用來進行映射的根了,其中,包含一個class節點,里面的name屬性對應我們的Person類,注意,需要完整的限定名;而table屬性,則顯而易見是對應數據庫中的Person表了。
我們再往里面看,分別有兩個節點,一個是id,對應數據庫中的id,一個是屬性name,對應表中的column name和Person類中的name屬性,整個映射文件簡捷明了,一看即知。實際上這是由代碼產生工具產生的映射文件,里面很多東西我們其實可以省略,如下寫法:
<property name=”Name” column=”name” />
NHibernate將自動去匹配數據庫中的列而不需要我們來設置。
下面,我們來看一下應用程序配置文件中都記錄了那些東西,如下:
hibernate.connection.provider_class??
定制IConnectionProvider的類型.
例如:full.classname.of.ConnectionProvider (如果提供者創建在NHibernate中), 或者 full.classname.of.ConnectionProvider, assembly (如果使用一個自定義的IConnectionProvider接口的實現,它不屬于NHibernate)。
?
hibernate.connection.driver_class??
定制IDriver的類型.
full.classname.of.Driver (如果驅動類創建在NHibernate中), 或者 full.classname.of.Driver, assembly (如果使用一個自定義IDriver接口的實現,它不屬于NHibernate)。
hibernate.connection.connection_string??
用來獲得連接的連接字符串.
hibernate.connection.isolation??
設置事務隔離級別. 請檢查 System.Data.IsolationLevel 來得到取值的具體意義并且查看數據庫文檔以確保級別是被支持的。
例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified
hibernate.dialect?
NHibernate方言(Dialect)的類名 - 可以讓NHibernate使用某些特定的數據庫平臺的特性
例如: full.classname.of.Dialect(如果方言創建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一個自定義的方言的實現,它不屬于NHibernate)。
接著,我們開始解釋代碼的執行,如下:
?
?
?
Configuration?config?=?new?Configuration().AddAssembly("Test.Model");//通過配置對象來產生一個SessionFactory對象,這是一個Session工廠,
//那么Session是用來干什么的呢?一個Session就是由NHibernate封裝
//的工作單元,我們可以近似地認為它起到ADO.Net中Connection的作用。
ISessionFactory?factory?=?config.BuildSessionFactory();
ISession?session?=?factory.OpenSession();
Person?person?=?new?Person();
person.Name?=?"Jackie?Chan";
//這里,開啟一個由NHibernate封裝的事務,當然,在這里最終代表
//的還是一個真實的數據庫事務,但是我們已經不需要再區分到底是
//一個SqlTransaction還是一個ODBCTransaction了
ITransaction?trans?=?session.BeginTransaction();
try
{
????//保存,提交,就這么簡單!!
?????????session.Save(person);
????????trans.Commit();
????????Console.WriteLine("Insert?Success!");
}
catch?(Exception?ex)
{
????????trans.Rollback();
????????Console.WriteLine(ex.Message);
}
?
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的NHibernate Step by Step (一) 转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WPF中的Attached Proper
- 下一篇: 一个设计反模式——究竟什么是轮子理论