管理办法NHibernate使用简介

NHibernate使用简介
NHibernate连忙指南

什么是NHibernate

NHibernate 是2个基于.Net 的针对关系型数据库的靶子持久化类库。Nhibernate
来源于分外精良的基于Java的Hibernate 关系型持久化学工业具。

NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate
为你处理那些,远胜于您不得不写SQL去从数据仓库储存取对象。你的代码仅仅和对象关联,NHibernat
自动发出SQL语句,并保管指标提交到科学的表和字段中去。

干什么写那么些指南

其它领悟Hibernate的人会意识这篇指南和Glen Smith 的A Hitchhiker’s Guide
to
Hibernate13分相近。那里的内容正是基于他的指南,因而具有的谢谢都应有予以他。

NHibernate的文书档案并非每处都和Hibernate的文书档案一致。可是,项目标一般应该能使读者通过读Hibernate的文书档案来很好的敞亮NHibernate怎么样工作。

那篇文书档案意在让你尽量快的起来利用NHibernate。它将介绍怎样持久化八个粗略的指标到一张表里。想获得更加多的扑朔迷离的例证,能够参考NUnit测试及附带代码。

支付的进程

Nhibernate今后将会提供一些工具协理你活动发出schema文件(未来照旧基于代码)或是通过炫耀文件发出类(在筹备阶段)或是更新
schema(来自于一个新开发者的指出)。可是,那里大家的事例是一旦一切来自于完全手写,包涵设置表和.Net类的编纂。大家将拓展以下步骤。

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

2.创设3个亟需被持久化的.Net类

3.塑造3个能够让NHibernate知道哪些持久化对象属性的炫耀文件

4.构建1个让NHibernate知道怎么连接数据库的安插文件]

5.使用NHibernate的API

第贰步:写营造表的SQL

那里我们将应用的是1个非凡不难的事例。借使你正在为你的网站开发一个着力的用户管理子系统。大家将选择如下的一张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 两千,
但也得以应用其它数据库,只要你有关于它们的基于.Net数据提供驱动程序。大家将赢得一个包涵LogonID,Name,
Password, Email 和LastLogon的表.
经过上述专业步骤,大家下一步是写2个.Net类处理3个加以的User对象。

第2步:发生二个.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知道哪些从一个辉映到另1个。这些职务注重于映射文件来实现。最不难管理的艺术是为每2个类写3个炫耀文件,假如您命名它是YourObject.hbm.xml
并且把它身处和类的同两个目录里,NHiberante将会使得业务大约起来。下边是三个User.hbm.xml的例子:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.0″>
        <class name=”NHibernate.Examples.QuickStart.User,
NHibernate.Examples” table=”users”>
               <id name=”Id” column=”LogonId” type=”String”
length=”20″>
                       <generator class=”assigned” />
               </id>
               <property name=”UserName” column= “Name” type=”String”
length=”40″/>
               <property name=”Password” type=”String”
length=”20″/>
               <property name=”EmailAddress” type=”String”
length=”40″/>
               <property name=”LastLogon” type=”DateTime”/>
        </class>
</hibernate-mapping>
让大家来探望这几个文件中让我们感兴趣的一点行。第3个好玩的标签是class。那里我们将映射类型名称(类名和装配件)到大家数据库中的User表,那里和
Hibernate有一丢丢的两样。你将只好告诉NHibernate从何处提取对象。在这一个事例里大家从装配件
NHibernate.Examples装载类NHibernate.Examples.QuickStart.User
。NHibernate 遵守和.Net
Framework同样的条条框框来加载类型。因而只要你在怎样钦定项目标方面有个别模糊,请参看.Net
Framework SDK。

让我们先跳过id标签,来钻探property标签。简要看一下,你将发现NHibernate所要做的办事。name属性的值便是大家.Net
类的性质,column属性值将是大家数据Curry的字段。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 不会再也编写翻译有转移的炫耀文件。

第6步:为您的数据库发生一个配备文件

咱们现今还未曾告诉NHibernate
去哪儿连接数据库。最直接的法子是在您的应用程序的铺排文件里安装三个NHibernate配置节。那和在Hibernate里接纳性质文件是等价的。如下配置:

<?xml version=”1.0″ encoding=”utf-8″ ?>
<configuration>
        <configSections>
               <section name=”nhibernate”
type=”System.Configuration.NameValueSectionHandler, System,
Version=1.0.3300.0,Culture=neutral, PublicKeyToken=b77a5c561934e089″
/>
        </configSections>
        <nhibernate>
               <add
                       key=”hibernate.connection.provider”         
                      
value=”NHibernate.Connection.DriverConnectionProvider”
               />
               <add
                       key=”hibernate.dialect”                     
                       value=”NHibernate.Dialect.MsSql2000Dialect”
               />
               <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”
               />
        </nhibernate>
</configuration>
上边包车型客车事例里用了SqlClient 驱动,在本地连接名称为NHibernate
的数据库,提供用户名和密码。那里有一堆属性你需求调整来分明什么让NHibernate来访问数据库。再一次应验,你能够在文书档案里拿走越多音讯。

请留心上述的陈设里并没有关联到log4net的布局音讯。NHibernate使用log4net来记录内部发生的方方面面。在一个应用程序产品里,在您一定条件里,小编推荐配置log4net,并为NHibernate设置一定的日记级别。

第⑥步:伊始呈现NHibernate的吸重力

怀有困难的行事早就成功。你将有以下内容

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

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

App.config
—对ADO.NET连接的配备信息(即便您愿意,你能够在代码中达成)。

您的数据Curry有一张User表。

现今得以在您的代码中非常简洁的施用NHibernate。简化的本子如下

创制三个Configuration对象
让Configuration知道你将积存何类别型的对象
为您选择的数据库创制1个Session对象
Load,Save和Query你的靶子
由此Session的Flush()方法将目的提交给数据库。
为了让你更清晰,大家来看某个代码。

率先,创立五个Configuration对象

Configuration对象能够分析全体.Net对象和后台数据库中的映射关系。

        Configuration cfg = new Configuration();
        cfg.AddAssembly(“NHibernate.Examples”);
Configuration对象会寻找装配件里的别的以hbm.xml
结尾的文书。还有此外艺术加载映射文件,但那种艺术是最简便易行的。

下一步,创建三个Session对象

ISession对象提供一个到后台数据库的连日,ITransaction对象提供三个足以被NHibernate管理的政工。

        ISessionFactory factory = cfg.BuildSessionFactory();
        ISession session = factory.OpenSession();
        ITransaction transaction = session.BeginTransaction();
随之来Load, Save和Query你的靶子

目前您能够用利用守旧的.Net方法来支配对象。你想保留3个新指标到数据库吗?尝试上面包车型地铁章程:

        User newUser = new User();
        newUser.Id = “joe_cool”;
        newUser.UserName = “Joseph Cool”;
        newUser.Password = “abc123”;
        newUser.EmailAddress = “joe@cool.com“;
        newUser.LastLogon = DateTime.Now;
        // Tell NHibernate that this object should be saved
        session.Save(newUser);
        // commit all of the changes to the DB and close the ISession
        transaction.Commit();
        session.Close();
正如你所阅览的,关于NHiberante首要的政工是这么简约。继续并且询问你的数据库,验证一下User表里的新记录。未来第1的作业正是您去担心业务对象并在拓展拍卖的时候告诉NHibernate就足以了。

让我们来报告您,当你有3个UserID的时候什么获取对象(举例说,登陆你的网站的时候)。仅仅一句话就能够打开Session,传入key就足以了

        // open another session to retrieve the just inserted user
        session = factory.OpenSession();
        User joeCool = (User)session.Load(typeof(User), “joe_cool”);
你所获得的User对象还在生存周期内!改变它的属性,并透过Flush()持久化到数据库。

        // set Joe Cool’s Last Login property
        joeCool.LastLogon = DateTime.Now;
        // flush the changes from the Session to the Database
        session.Flush();
你所要做的就是透过NHibernate来开始展览你必要的更改,并调用Session的Flush()方法提交。验证一下数据库,查查用户ID为”joe_cool”的笔录中”LastLogon”的改观。

还有更好的,你能够以System.Collections.IList的方法来赢得从表中的指标。如下

        IList userList = session.CreateCriteria(typeof(User)).List();
        foreach(User user in userList)
        {
               System.Diagnostics.Debug.WriteLine(user.Id + ” last
logged in at ” + user.LastLogon);
        }
其一查询将会回来全体表记录。往往你须求做越来越多的操纵,比如说获取从March
14, 二零零三 10:00 PM 以往登陆的用户,如下:
        IList recentUsers = session.CreateCriteria(typeof(User))
                                     
.Add(Expression.Expression.Gt(“LastLogon”, new DateTime(2004, 03, 14,
20, 0, 0)))
                                      .List();
        foreach(User user in recentUsers)
        {
               System.Diagnostics.Debug.WriteLine(user.Id + ” last
logged in at ” + user.LastLogon);
        }
文书档案里还有一堆健壮的询问办法让您调用,那里唯有让你对NHibernate所提供的无敌的工具有肯定的摸底。
末段调用Session对象的Close()方法,释放NHibernate所使用的ADO.Net连接财富
        // tell NHibernate to close this Session
管理办法,        session.Close();
更方便地说…

您早就成功创制对象,持久化并通过标准查询或键值查询来回到它。相信您早已从中获得开心。

当今你对NHibernate有了大约的问询,假如您能细致翻阅大批量源于Hibernate
2.0.3文书档案,你将获取帮助(NHibernate文书档案还在中期阶段,今后还独自是对Hibernate的正片)。


在库文件中要有

Iesi.Collections.dll

HashCodeProvider.dll

那多少个公文。不用引用到程序。但nhibernate会使用到。

将他们放在nhibernate相同的目录下就足以了,系统会寻找后拷贝到bin\debug\上面。当然一贯放进去也能够。

除此以外在布署文件中,主键要写成

<generator class=”assigned” />

不然主键会加不进去

发表评论

电子邮件地址不会被公开。 必填项已用*标注