NHibernate快速指南(翻译)

http://nhibernate.sourceforge.net/quickstart.html

** NHibernate ** ** 快速指南 ** ** **


** 什么是 ** ** NHibernate **


NHibernate 是一个基于 .Net 的针对关系型数据库的对象持久化类库。 Nhibernate 来源于非常优秀的基于 Java 的 Hibernate 关系型持久化工具。

NHibernate 从数据库底层来持久化你的 .Net 对象到关系型数据库。 NHibernate 为你处理这些,远胜于你不得不写 SQL 去从数据库存取对象。你的代码仅仅和对象关联, NHibernat 自动产生 SQL 语句,并确保对象提交到正确的表和字段中去。

** 为什么写这个指南 ** ** **


任何熟悉 Hibernate 的人会发现这篇指南和 Glen Smith 的 A Hitchhiker's Guide to Hibernate 非常相近。这里的内容正是基于他的指南,因此所有的感谢都应该给与他。

NHibernate 的文档并非每处都和 Hibernate 的文档一致。然而,项目的相似应该能使读者通过读 Hibernate 的文档来很好的理解 NHibernate 如何工作。

这篇文档意在让你尽可能快的开始使用 NHibernate 。它将介绍如何持久化一个简单的对象到一张表里。想得到更多的复杂的例子,可以参考 NUnit 测试及附带代码。

** 开发的过程 ** ** **


Nhibernate 未来将会提供一些工具帮助你自动产生 schema 文件(现在还是基于代码)或是通过映射文件产生类(在筹措阶段)或是更新 schema( 来自于一个新开发者的建议 ) 。然而,这里我们的例子是假定一切来自于完全手写,包括设置表和 .Net 类的编写。我们将进行以下步骤。

1. 新建一个将要持久化 .Net 对象的表

2. 构建一个需要被持久化的 .Net 类

3. 构建一个可以让 NHibernate 知道如何持久化对象属性的映射文件

4. 构建一个让 NHibernate 知道如何连接数据库的配置文件 ]

5. 使用 NHibernate 的 API

** 第一步:写构建表的 ** ** SQL **


这里我们将使用的是一个非常简单的例子。假设你正在为你的网站开发一个基本的用户管理子系统。我们将使用如下的一张 User 表(假定你已经设置好一个数据库 — 在的例子里我称它为 NHibernate )。

               


use NHibernate


go


 


CREATE TABLE users (


  LogonID nvarchar(20) NOT NULL default '0',


  Name nvarchar(40) default NULL,


  Password nvarchar(20) default NULL,


  EmailAddress nvarchar(40) default NULL,


  LastLogon datetime default NULL,


  PRIMARY KEY  (LogonID)


)


go

我使用的是 MS Sql Server 2000, 但也可以使用任何数据库,只要你有关于它们的基于 .Net 数据提供驱动程序。我们将得到一个含有 LogonID,Name, Password, Email 和 LastLogon 的表 . 经过以上标准步骤,我们下一步是写一个 .Net 类处理一个给定的 User 对象。

** 第二步 ** ** : ** ** 产生一个 ** ** .Net ** ** 类文件 ** ** **


当内存中有一堆 User 对象的时候,我们需要某种对象去保存它们。 NHibernate 通过对象属性的反射来工作,因此我们需要添加我们希望持久化的对象属性。一个可以被 NHibernate 持久化的类应该看起来象下面的样子:

               


using System;


 


namespace NHibernate.Demo.QuickStart


{


        public class User


        {


               private string id;


               private string userName;


               private string password;


               private string emailAddress;


               private DateTime lastLogon;


 


 


               public User()


               {


               }


 


               public string Id 


               {


                       get { return id; }


                       set { id = value; }


               }


 


               public string UserName 


               {


                       get { return userName; }


                       set { userName = value; }


               }


 


               public string Password 


               {


                       get { return password; }


                       set { password = value; }


               }


 


               public string EmailAddress 


               {


                       get { return emailAddress; }


                       set { emailAddress = value; }


               }


 


               public DateTime LastLogon 


               {


                       get { return lastLogon; }


                       set { lastLogon = value; }


               }


               


        }


}

在上面的例子里,我们的属性和构建函数 是 public ,但这个对 NHibernate 不是必要的 . 它可以使用 public, protected, internal 或者甚至是用 private 来持久化数据。

** 第三步:写映射文件 ** ** **

现在我们有数据表和需要去映射它的 .Net 类。我们需要一种方式去让 NHibernate 知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。最易于管理的办法是为每一个类写一个映射文件,如果你命名它是 YourObject.hbm.xml 并且把它放在和类的同一个目录里, NHiberante 将会使得事情简单起来。下面是一个 User.hbm.xml 的例子:

 1<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
 2    
 3    
 4            <class name="NHibernate.Examples.QuickStart.User, NHibernate.Examples" table="users">
 5    
 6    
 7                   <id column="LogonId" length="20" name="Id" type="String"> 
 8    
 9    
10                           <generator class="assigned"></generator> 
11    
12    
13                   </id> 
14    
15    
16                   <property column="Name" length="40" name="UserName" type="String"></property> 
17    
18    
19                   <property length="20" name="Password" type="String"></property> 
20    
21    
22                   <property length="40" name="EmailAddress" type="String"></property>
23    
24    
25                   <property name="LastLogon" type="DateTime"></property>
26    
27    
28            </class>
29    
30    
31     
32    
33    
34    </hibernate-mapping>

让我们来看看这个文件中让我们感兴趣的某些行。第一个有趣的标签是 class 。这里我们将映射类型名称 ( 类名和装配件 ) 到我们数据库中的 User 表,这里和 Hibernate 有一点点的不同。你将不得不告诉 NHibernate 从何处提取对象。在这个例子里我们从装配件 NHibernate.Examples 装载类 NHibernate.Examples.QuickStart.User NHibernate 遵循和 .Net Framework 同样的规则来加载类型。因此如果你在如何指定类型的方面有些混淆,请参看 .Net Framework SDK

让我们先跳过 id 标签,来讨论 property 标签。简要看一下,你将发现 NHibernate 所要做的工作。 name 属性的值正是我们 .Net 类的属性, column 属性值将是我们数据库里的字段。 type 属性是可选的(如果你不标明, NHibernate 将利用反射进行最佳的推测)。

好了,让我们回到标签 id, 你可以猜测到这个标签将是映射数据库表的主键,的确如此, id 标签的组成和我们刚才看的 property 标签是相似的。我们映射属性到目标数据库的字段。

内嵌的 generator 标签告诉 NHibernate 如何生成主键(它将恰当的为你生成主键,不管你指定何种类型,但你必须告诉它)。在我们的例子里,我们设定为 assigned, 意味着我们对象将自己生成主键(毕竟 User 对象常常需要一个 UserID )。如果你执意要 NHiberante 为你生成主键,你感兴趣于设定 uuid.hex uuid.string (从文档中获取更多信息)

提示:如果你使用 Visual Studio.Net 去编译的话,请将 user.hbm.xml 的 Build Action 属性设置为 Embedded Resource 。映射文件将成为装配件的一部分。更详细的细节重点将在后面展示。

提示:如果你仅仅是改变映射文件,你不能使用 build 而应该 Rebuild 项目。 Visual Studio.Net 不会重新编译有改变的映射文件。

** 第四步:为你的数据库产生一个配置文件 ** ** **

我们至今还没有告诉 NHibernate 去哪里连接数据库。最直接的办法是在你的应用程序的配置文件里设置一个 NHibernate 配置节。这和在 Hibernate 里使用属性文件是等价的。如下配置:

 1<configuration>
 2    
 3    
 4            <configsections>
 5    
 6    
 7                   <section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"></section>
 8    
 9    
10            </configsections>
11    
12    
13            
14    
15    
16            <nhibernate>
17    
18    
19                   <add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"></add>
20    
21    
22                   <add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect"></add>
23    
24    
25                   <add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"></add>
26    
27    
28                   <add key="hibernate.connection.connection_string" value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"></add>
29    
30    
31            </nhibernate>
32</configuration>

上面的例子里用了 SqlClient 驱动,在本地连接名称为 NHibernate 的数据库,提供用户名和密码。那里有一堆属性你需要调整来确定如何让 NHibernate 来访问数据库。再次说明,你可以在文档里获取更多信息。

请注意以上的配置里并没有涉及到 log4net 的配置信息。 NHibernate 使用 log4net 来记录内部发生的一切。在一个应用程序产品里,在你特定环境里,我推荐配置 log4net ,并为 NHibernate 设置一定的日志级别。

** 第五步:开始展现 ** ** NHibernate ** ** 的魔力 ** ** **

所有艰苦的工作已经完成。你将有以下内容

User.cs ---- 你需要持久化的 C# 类

User.hbm.xml ---- 你的 NHibernate 映射文件

App.config --- 对 ADO.NET 连接的配置信息(如果你愿意,你可以在代码中实现)。

你的数据库里有一张 User 表。

现在可以在你的代码中恰当简洁的使用 NHibernate 。简化的版本如下

  1. 创建一个 Configuration 对象
  2. 让 Configuration<SPAN lang=ZH-CN style="FONT-FAMILY: SimSun; mso-ascii-font-family: 'Times New Roman'; mso-
Published At
Categories with Web编程
Tagged with
comments powered by Disqus