日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NHibernate Step by Step (一) 转载

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 (一) 转载的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧美变态另类丝袜第一区 | 免费看欧美片 | 黄色污在线观看 | 国产一级在线视频 | 男男野外做爰全过程69 | 成人一区二区免费视频 | 蜜色av| 日韩欧美黄色大片 | 可以直接观看的av | 国产三级在线播放 | 黄色免费在线看 | 日韩丰满少妇无码内射 | 99热在线观看免费精品 | 久操视频免费在线观看 | 一卡二卡三卡四卡五卡 | 亚洲精品一区二区三区中文字幕 | 国产孕妇孕交大片孕 | 三级网站在线播放 | 免费不卡毛片 | 激情五月色播五月 | 国产精品毛片久久 | 精品福利三区3d卡通动漫 | 日韩亚洲欧美一区 | 激情五月婷婷色 | 视频一区国产 | 欧美一区二区三区公司 | 婷婷综合亚洲 | 午夜欧美激情 | 一区二区高清在线观看 | 人乳喂奶hd无中字 | 成年人视频在线播放 | 国产伦理久久精品久久久久 | 少妇熟女一区二区 | 国产精品天干天干 | 韩日欧美 | 国产精品第108页 | 艳妇乳肉豪妇荡乳av | 少妇性l交大片免潘金莲 | 成人av电影天堂 | 国产手机视频在线 | 亚洲精品一卡二卡 | 性三级视频 | 日日碰狠狠躁久久躁蜜桃 | 蜜臀99久久精品久久久久久软件 | 日韩国产区 | 少妇高潮久久久久久潘金莲 | 免费欧美黄色 | 人人艹人人爽 | 男人在线视频 | 午夜做爰xxxⅹ性高湖视频美国 | 四虎在线视频免费观看 | 久久人人爽人人 | 久久久久久69 | 亚洲av无码精品色午夜 | 国产浪潮av | 一区二区在线观看视频 | 天天综合av | 久久久伊人网 | 免费国产 | 久久午夜无码鲁丝片 | 中文字幕人妻一区二区三区视频 | 特黄一区| 美女考逼 | а√天堂www在线天堂小说 | 奴色虐av一区二区三区 | 国产精品毛片久久久久久 | 久久亚洲中文字幕无码 | 亚洲欧美日韩精品久久 | 天天撸天天操 | 男人视频网站 | 美国三级a三级18 | 亚洲调教欧美在线 | 青青草av在线播放 | 91精品国产乱码在线观看 | 一级特黄av | 久久久综合色 | 国产精品福利在线观看 | 日本激情视频在线观看 | 麻豆av免费观看 | 青青草国产在线播放 | 日韩欧美国产亚洲 | 欧美黄色三级视频 | 在线观看国产日韩 | 浓精喷进老师黑色丝袜在线观看 | 波多一区二区 | 中文字幕精品在线 | 亚欧在线视频 | 黄网在线免费 | 98国产视频 | 中文人妻熟妇乱又伦精品 | 女女av在线| 美女张开腿露出尿口 | 国产极品久久 | 国产欧美一区二区三区另类精品 | 欧美狂猛xxxxx乱大交3 | 糖心视频在线 | 超碰人人国产 | 香蕉国产999 | 国产强被迫伦姧在线观看无码 |