日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

NHibernate Step by Step (一) Hello,NHibernat

系統(tǒng) 2440 0

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ù)):

USE[NHibernate]
GO
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
SETANSI_PADDINGON
GO
CREATETABLE[dbo].[Person](
[id][
int ]IDENTITY( 1 , 1 )NOTNULL,
[name][varchar](
50 )COLLATEChinese_PRC_CI_ASNOTNULL,
CONSTRAINT[PK_Person]PRIMARYKEYCLUSTERED
(
[id]ASC
)WITH(IGNORE_DUP_KEY
= OFF)ON[PRIMARY]
)ON[PRIMARY]

GO
SETANSI_PADDINGOFF

僅有兩個(gè)字段,一個(gè)自動(dòng)增長(zhǎng)的id,一個(gè)name,如下:
NHibernate Step by Step (一) Hello,NHibernate!

然后將下載的nhibernate-template解壓,打開(kāi)Code Smith,將模板加入”Template Explorer”,如下:
NHibernate Step by Step (一) Hello,NHibernate!

然后在其中的NHibernate.cst上點(diǎn)右鍵,選擇“Execute”,彈出設(shè)置窗口,在左邊的屬性窗口進(jìn)行如下設(shè)置:
NHibernate Step by Step (一) Hello,NHibernate!

注 意: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”,如下:
NHibernate Step by Step (一) Hello,NHibernate!

然 后將剛才生成的兩個(gè)文件Person.cs和Person.hbm.xml加入到Model工程中來(lái),選中Person.hbm.xml文件,在屬性窗口 中將其“Build Action”設(shè)置為“Embedded Resource”(這是非常重要的一步,否則NHibernate將無(wú)法找到映射文件),如下:
NHibernate Step by Step (一) Hello,NHibernate!

build,ok,通過(guò)。

然后建立一個(gè)控制臺(tái)工程,命名為Console1,添加NHibernate和上面Model項(xiàng)目的引用,另外添加一個(gè)應(yīng)用程序配置文件,如下:

<? xmlversion="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;InitialCatalog=NHibernate;IntegratedSecurity=SSPI" />
< add key ="hibernate.connection.isolation" value ="ReadCommitted" />
< add key ="hibernate.dialect" value ="NHibernate.Dialect.MsSql2000Dialect" />
</ nhibernate >

</ configuration >


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

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)
{
Configurationconfig
= new Configuration().AddAssembly( " Test.Model " );
ISessionFactoryfactory
= config.BuildSessionFactory();
ISessionsession
= factory.OpenSession();

Personperson
= new Person();
person.Name
= " JackieChan " ;

ITransactiontrans
= session.BeginTransaction();
try
{
session.Save(person);
trans.Commit();
Console.WriteLine(
" InsertSuccess! " );
}

catch (Exceptionex)
{
trans.Rollback();
Console.WriteLine(ex.Message);
}

}

}

}


運(yùn)行,ok,執(zhí)行成功!!
我們到數(shù)據(jù)庫(kù)檢查一下,如下:


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

using System;
using System.Collections;

namespace Test.Model
{
Person #region Person

/**/ /// <summary>
/// PersonobjectforNHibernatemappedtable'Person'.
/// </summary>

public class Person
{
MemberVariables #region MemberVariables

protected int _id;
protected string _name;

#endregion


Constructors #region Constructors

public Person() {}

public Person( string name)
{
this ._name = name;
}


#endregion


PublicProperties #region PublicProperties

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( " InvalidvalueforName " ,value,value.ToString());
_name
= value;
}

}




#endregion

}

#endregion

}


你可以發(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,如下:

<? xmlversion="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 >


不用說(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í)行,如下:

Configurationconfig = new Configuration().AddAssembly( " Test.Model " );

// 通過(guò)配置對(duì)象來(lái)產(chǎn)生一個(gè)SessionFactory對(duì)象,這是一個(gè)Session工廠,
// 那么Session是用來(lái)干什么的呢?一個(gè)Session就是由NHibernate封裝
// 的工作單元,我們可以近似地認(rèn)為它起到ADO.Net中Connection的作用。
ISessionFactoryfactory = config.BuildSessionFactory();
ISessionsession
= factory.OpenSession();

Personperson
= new Person();
person.Name
= " JackieChan " ;

// 這里,開(kāi)啟一個(gè)由NHibernate封裝的事務(wù),當(dāng)然,在這里最終代表
// 的還是一個(gè)真實(shí)的數(shù)據(jù)庫(kù)事務(wù),但是我們已經(jīng)不需要再區(qū)分到底是
// 一個(gè)SqlTransaction還是一個(gè)ODBCTransaction了
ITransactiontrans = session.BeginTransaction();
try
{
// 保存,提交,就這么簡(jiǎn)單!!
session.Save(person);
trans.Commit();
Console.WriteLine(
" InsertSuccess! " );
}

catch (Exceptionex)
{
trans.Rollback();
Console.WriteLine(ex.Message);
}


現(xiàn)在有了一個(gè)基本的概念了吧??
好了,第一篇就講這么多,我們下次再接著練習(xí)。

Step by Step,顧名思義,是一步一步來(lái)的意思,整個(gè)教程我將貫徹這一理念,待此系列結(jié)束后,我們?cè)倬湍承└呒?jí)話題進(jìn)行深入。
任何建議或者批評(píng),請(qǐng)e: abluedog@163.com

NHibernate Step by Step (一) Hello,NHibernate!


更多文章、技術(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ì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 新建县| 台山市| 崇阳县| 乡城县| 新化县| 南溪县| 渭南市| 拜城县| 临沂市| 和林格尔县| 庆阳市| 万源市| 塔河县| 琼结县| 济阳县| 聂荣县| 开江县| 普兰县| 肇州县| 盐边县| 读书| 扬州市| 宾阳县| 台江县| 沙河市| 高淳县| 进贤县| 封丘县| 潜江市| 莲花县| 安吉县| 嫩江县| 昔阳县| 巴林右旗| 财经| 南华县| 四平市| 台北县| 苍梧县| 通化市| 孟津县|