`
guanhuaing
  • 浏览: 1196645 次
文章分类
社区版块
存档分类
最新评论

NHibernate Step by Step (一) Hello,NHibernate!

 
阅读更多
NHibernate Step by Step (一) Hello,NHibernate!
好了,今天我们正式开始NHibernate的历程,在第一次的练习中,我将尽量详细地讲解环境的配置,以后将不再详细解释。

基本的软件环境如下:
1.NHibernatewww.nhibernate.org当前版本是1.0.2
2.Code Smithhttp://www.codesmithtools.com/
3.NHibernate模板 点击这里下载
当然,少不了VS2005跟SQLServer了,我这里用的是SQLServer2005,教程用在SQLServer2000上应该没有问题,默认情况下,我将建立并使用一个叫NHibernate的数据库。

首先,我们先建立一个最简单的Person表,如下完整脚本(你可以进行修改以适合自己的数据库):

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

仅有两个字段,一个自动增长的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项目的引用,另外添加一个应用程序配置文件,如下:

<?xmlversion="1.0"encoding="utf-8"?>
<configuration>
<configSections>
<sectionname="nhibernate"type="System.Configuration.NameValueSectionHandler,System,
Version=1.0.5000.0,Culture=neutral,PublicKeyToken=b77a5c561934e089"
/>
</configSections>

<nhibernate>
<addkey="hibernate.connection.provider"value="NHibernate.Connection.DriverConnectionProvider"/>
<addkey="hibernate.connection.driver_class"value="NHibernate.Driver.SqlClientDriver"/>
<addkey="hibernate.connection.connection_string"value="Server=localhost;InitialCatalog=NHibernate;IntegratedSecurity=SSPI"/>
<addkey="hibernate.connection.isolation"value="ReadCommitted"/>
<addkey="hibernate.dialect"value="NHibernate.Dialect.MsSql2000Dialect"/>
</nhibernate>

</configuration>


然后编写如下代码:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingNHibernate;
usingNHibernate.Cfg;
usingTest.Model;

namespaceConsole1
{
classProgram
{
staticvoidMain(string[]args)
{
Configurationconfig
=newConfiguration().AddAssembly("Test.Model");
ISessionFactoryfactory
=config.BuildSessionFactory();
ISessionsession
=factory.OpenSession();

Personperson
=newPerson();
person.Name
="JackieChan";

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

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

}

}

}


运行,ok,执行成功!!
我们到数据库检查一下,如下:


我们想要添加的记录已经成功加入到数据库中!!
是不是感觉有些神奇啊?好,我们开始详细解释。
先来看生成的两个文件,第一个是Person.cs,如下:

usingSystem;
usingSystem.Collections;

namespaceTest.Model
{
Person#regionPerson

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

publicclassPerson
{
MemberVariables#regionMemberVariables

protectedint_id;
protectedstring_name;

#endregion


Constructors#regionConstructors

publicPerson(){}

publicPerson(stringname)
{
this._name=name;
}


#endregion


PublicProperties#regionPublicProperties

publicintId
{
get{return_id;}
set{_id=value;}
}


publicstringName
{
get{return_name;}
set
{
if(value!=null&&value.Length>50)
thrownewArgumentOutOfRangeException("InvalidvalueforName",value,value.ToString());
_name
=value;
}

}




#endregion

}

#endregion

}


你可以发现,这完全是一个普通的poco类(Plain Old CLR Object),仅仅是对数据库person表的一个完全映射,不依赖于任何框架,可以用来作为持久化类,你可以在任何地方使用而不用担心依赖于某些神秘的运行时东西。

另外,NHibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是NHibernate映射文件发挥作用的地方。映射文件告诉NHibernate它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column),这就是我们今天要讲的重点了,Person.hbm.xml,如下:

<?xmlversion="1.0"encoding="utf-8"?>
<hibernate-mappingxmlns="urn:nhibernate-mapping-2.0">
<classname="Test.Model.Person,Test.Model"table="Person">
<idname="Id"type="Int32"unsaved-value="0">
<columnname="id"sql-type="int"not-null="true"unique="true"index="PK_Person"/>
<generatorclass="native"/>
</id>
<propertyname="Name"type="String">
<columnname="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)。

接着,我们开始解释代码的执行,如下:

Configurationconfig=newConfiguration().AddAssembly("Test.Model");

//通过配置对象来产生一个SessionFactory对象,这是一个Session工厂,
//那么Session是用来干什么的呢?一个Session就是由NHibernate封装
//的工作单元,我们可以近似地认为它起到ADO.Net中Connection的作用。
ISessionFactoryfactory=config.BuildSessionFactory();
ISessionsession
=factory.OpenSession();

Personperson
=newPerson();
person.Name
="JackieChan";

//这里,开启一个由NHibernate封装的事务,当然,在这里最终代表
//的还是一个真实的数据库事务,但是我们已经不需要再区分到底是
//一个SqlTransaction还是一个ODBCTransaction了
ITransactiontrans=session.BeginTransaction();
try
{
//保存,提交,就这么简单!!
session.Save(person);
trans.Commit();
Console.WriteLine(
"InsertSuccess!");
}

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


现在有了一个基本的概念了吧??
好了,第一篇就讲这么多,我们下次再接着练习。

Step by Step,顾名思义,是一步一步来的意思,整个教程我将贯彻这一理念,待此系列结束后,我们再就某些高级话题进行深入。

分享到:
评论

相关推荐

    NHibernate Step by Step入门教程

    NHibernate Step by Step(系列教程)

    NHibernate Step by Step(教程).doc

    NHibernate Step by Step(教程) 一致五,word版

    Linq2NHibernate.Step1

    Linq2NHibernate.Step1

    nhibernate 源码nhibernate 源码

    nhibernate 源码nhibernate 源码nhibernate 源码nhibernate 源码

    nhibernate

    nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#nhibernate c#

    NHibernate中文文档

    很多NHibernate的学习者往往都是通过Hibernate的文档来学习,但是毕竟不是所有的.Net开发者都熟悉Java,也不是所有的人都有精力有时间去学习Java,所以,我准备开始一个Step by Step的NHibernate教程,以便有兴趣的...

    Nhibernate3.0

    最新的3.0版本,Welcome to NHibernate! -------------------------------------------------------------------------------- NHibernate is a .NET based object persistence library for relational databases....

    学习NHibernate的范例

    学习NHibernate的范例!!

    Fluent nHibernate

    Fluent nHibernate,简化nHibernate工作量的好工具。 nHibernate相信用C#跟数据库打交道的多少知道一些,用过nHibernate的对其中nHibernate的XML配置文件的繁杂应该深有印象。Fluent nHibernate就是为简化nHibernate...

    Nhibernate从入门到精通

    NHibernate 入门之旅教程 PDF版,写这个小书也算是对自己学习NHibernate的一个总结吧。再次向对NHibernate陌生的朋友介绍一下NHibernate,它是一个面向.NET 环境的对象/关系数据库映射工具。用来把对象映射到基于SQL...

    .NET中强大的框架NHibernate

    主要对NHibernate如何配置,实现简单的增删改,方便初学者借鉴!NHibernate同Java的Hibernate一样!

    NHibernate.JetDriver(基于NHibernate 3.1)

    让NHibernate支持Access数据库的驱动程序,源自Hibernate官方,但官方早不支持了(已从NHibernate主类库剔除),这个是基于NHibernate 3.1.0.4000的,需要NHibernate其他版本的话,请打开解决方案引入不同版本的...

    NHibernate-2.1.2.GA-bin NHibernate框架

    使用与.net开发的NHibernate框架,这个版本是比较老,但是比较经典的。 我也是使用这个来在.net开发的。给大家共享一下。

    NHibernate

    最近这段时间在学习NHibernate 于是写了一个基于NHibernate的留言本 ,计较适合初学者入门!!

    一本不错NHibernate学习书

    一本不错NHibernate学习书,比较全面讲解,可以帮助开发人员很快入门以及提高

    NHibernate 入门之旅(数据库教程)PDF版.rar

    NHibernate 入门之旅教程 PDF版,写这个小书也算是对自己学习NHibernate的一个总结吧。再次向对NHibernate陌生的朋友介绍一下NHibernate,它是一个面向.NET 环境的对象/关系数据库映射工具。用来把对象映射到基于SQL...

    NHibernate2.0中文文档

    NHibernate2.0中文文档 NHibernate2.0中文文档 NHibernate2.0中文文档

    NHibernate_Demo

    C# NHibernate开源库的一个使用例子Demo

    NHibernate+Oracle NHibernate+MySql Demo

    实现NHibernate+Oracle 与NHibernate+MySql 的连接,以及增删改查的初步使用

Global site tag (gtag.js) - Google Analytics