95992828九五至尊2

NHibernate使用简介

三月 9th, 2019  |  九五至尊1老品牌值得

NHibernate使用简介
NHibernate飞速指南

什么是NHibernate

什么是NHibernate

 

NHibernate 是叁个基于.Net 的指向关系型数据库的目标持久化类库。Nhibernate
来源于非凡突出的基于Java的Hibernate 关系型持久化学工业具。

NHibernate 是2个基于.net
的指向关系型数据库的靶子持久化类库。NHibernate
来源于卓殊出色的依照Java的Hibernate
关系型持久化学工业具。

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

NHibernate 从数据库底层来持久化你的.net 对象到关系型数据库。NHibernate
为你处理那个,远胜于你只可以写SQL去从数据仓库储存取对象

怎么写那个指南

。你的代码仅仅和对象关联,NHibernat
自动发出SQL语句,并保管目标提交到正确的表和字段中去。

其余熟谙Hibernate的人会意识这篇指南和Glen Smith 的A Hitchhiker’s Guide
to
Hibernate十分相近。那里的剧情正是依据他的指南,因而具有的感恩戴义都应有予以他。

 

NHibernate的文书档案并非每处都和Hibernate的文书档案一致。但是,项目标貌似应该能使读者通过读Hibernate的文书档案来很好的驾驭NHibernate如何工作。

那篇文书档案意在让你尽量快的起来运用NHibernate。它将介绍怎么着持久化3个粗略的靶子到一张表里,完结对表的操作。

那篇文书档案意在让你尽量快的发轫选拔NHibernate。它将介绍如何持久化一个简短的对象到一张表里。想赢得越来越多的繁杂的例子,能够参考NUnit测试及附带代码。

 

付出的历程

支付的进程

Nhibernate现在将会提供一些工具支持您活动发出schema文件(未来照旧基于代码)或是通过炫耀文件发出类(在张罗阶段)或是更新
schema(来自于一个新开发者的建议)。不过,那里大家的例证是一旦一切来自于完全手写,包蕴设置表和.Net类的编纂。我们将拓展以下步骤。

 

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

我们将拓展以下步骤:

2.营造二个内需被持久化的.Net类

1.新建1个即将持久化.net对象的表

3.营造二个足以让NHibernate知道哪些持久化对象属性的炫耀文件

2.营造2个索要被持久化的.net类

4.构建一个让NHibernate知道什么连接数据库的配备文件]

3.营造三个方可让NHibernate知道什么样持久化对象属性的映射文件

5.使用NHibernate的API

4.营造三个让NHibernate知道如何连接数据库的计划文件

率先步:写营造表的SQL

5.使用NHibernate的API

那里大家将利用的是多个非凡简单的事例。若是你正在为您的网站开发一个为主的用户管理子系统。大家将动用如下的一张User表(假定你曾经设置好三个数据库—在的例子里自己称它为NHibernate)。

6.测试

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 类文件

先是步:写创设表的SQL

当内存中有一堆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来持久化数据。

此处大家将动用的是贰个非凡简单的例证。倘若你正在为您的网站开发八个着力的用户管理子系统。大家将采纳如下的一张User表(假定你曾经设置好三个数据库—例子里本人称它为test)。

其三步:写映射文件

 

当今大家有数据表和须要去炫耀它的.Net类。我们供给一种方式去让NHibernate知道怎么样从二个辉映到另二个。那些职分重视于映射文件来实现。最不难管理的办法是为每2个类写多少个辉映文件,如若您命名它是YourObject.hbm.xml
并且把它位于和类的同一个索引里,NHiberante将会使得业务差不离起来。下边是一个User.hbm.xml的例证:

CREATE TABLE users (

<?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>
让我们来探视这些文件中让我们感兴趣的有些行。第②个有趣的标签是class。那里大家将映射类型名称(类名和装配件)到我们数据库中的User表,那里和
Hibernate有一丝丝的不比。你将不得不告诉NHibernate从何方提取对象。在那几个事例里大家从装配件
NHibernate.Examples装载类NHibernate.Examples.QuickStart.User
。NHibernate 坚守和.Net
Framework同样的规则来加载类型。由此要是你在怎么着内定项指标上边有个别模糊,请参看.Net
Framework SDK。

LogonID integer not null ,

让大家先跳过id标签,来谈谈property标签。简要看一下,你将发现NHibernate所要做的干活。name属性的值便是大家.Net
类的特性,column属性值将是我们数据Curry的字段。type属性是可选的(倘使您不评释,NHibernate将采纳反射进行最佳的推理)。

Name nvarchar(40) default NULL,

好了,让大家回来标签id,
你能够推测到这一个标签将是炫耀数据库表的主键,的确如此,id标签的结缘和我们刚刚看的property标签是一般的。大家映射属性到指标数据库的字段。

Password nvarchar(20) default NULL,

内嵌的generator 标签告诉NHibernate
如何变化主键(它将适度的为您转移主键,不管您钦赐何系列型,但你必须告诉它)。在大家的事例里,我们设定为assigned,意味着我们对象将团结生成主键(毕竟User对象经常必要二个UserID)。借使你就是要NHiberante为你转移主键,你感兴趣于设定uuid.hex和
uuid.string(从文档中拿走越来越多信息)

EmailAddress nvarchar(40) default NULL,

提示:假使您利用Visual Studio.Net 去编写翻译的话,请将user.hbm.xml的Build
Action属性设置为Embedded
Resource。映射文件将成为装配件的一部分。更详尽的细节重点将在前边体现。

LastLogon datetime default NULL,

唤醒:如若你仅仅是改变映射文件,你不可能动用build
而应当Rebuild项目。Visual Studio.Net 不会再也编写翻译有转移的炫耀文件。

PRIMARY KEY (LogonID)

第4步:为你的数据库发生二个布署文件

)

小编们于今还不曾告诉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来访问数据库。再一次注明,你能够在文书档案里获取越来越多消息。

自小编利用的是sqlite,
但也得以行使其余数据库,只要你有关于它们的基于.net数据提供驱动程序。大家将赢得一个包涵LogonID,Name,
Password, Email 和LastLogon的表.
经过以上标准步骤,大家下一步是写三个.net类处理3个加以的User对象。

请留心上述的安顿里并没有涉及到log4net的布署消息。NHibernate使用log4net来记录内部爆发的一切。在1个应用程序产品里,在你一定条件里,小编引进配置log4net,并为NHibernate设置一定的日志级别。

 

第六步:开始呈现NHibernate的吸重力

其次步:发生2个.Net 类文件

富有困难的办事已经形成。你将有以下内容

 

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

当内部存款和储蓄器中有一堆User对象的时候,我们必要某种对象去保存它们。NHibernate通过对象属性的反光来行事,因而大家必要添加大家期待持久化的对象属性。3个方可被NHibernate持久化的类应该看起来象下边包车型客车典范:

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

 

App.config
—对ADO.NET连接的陈设音讯(倘若您愿意,你能够在代码中达成)。

复制代码

你的数据Curry有一张User表。

using System;

目前得以在您的代码中万分简洁的使用NHibernate。简化的本子如下

 

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

namespace NHibernate.Domain

先是,创设一个Configuration对象

{

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

    public class User

        Configuration cfg = new Configuration();
        cfg.AddAssembly(“NHibernate.Examples”);
Configuration对象会招来装配件里的别的以hbm.xml
结尾的文本。还有任何格局加载映射文件,但那种方法是最简易的。

    {

下一步,制造二个Session对象

        public virtual int Id { get; set; }

ISession对象提供四个到后台数据库的连日,ITransaction对象提供3个足以被NHibernate管理的事体。

 

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

        public virtual string UserName { get; set; }

如今您能够用利用守旧的.Net方法来控制对象。你想保留多少个新指标到数据库吗?尝试下边包车型大巴章程:

 

        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表里的新记录。现在重点的工作就是您去担心业务对象并在拓展拍卖的时候告诉NHibernate就足以了。

        public virtual string Password { get; set; }

让大家来报告您,当您有二个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()持久化到数据库。

        public virtual string EmailAddress { get; set; }

        // 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的不二法门来获得从表中的靶子。如下

        public virtual DateTime LastLogon { get; set; }

        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

以往我们有数据表和急需去炫耀它的.net类。我们需求一种方法去让NHibernate知道哪些从三个映射到另一个。那一个职分重视于映射文件来成功。最不难管理的不二法门是为每2个类写二个映射文件,假使你命名它是YourObject.hbm.xml
并且把它坐落和类的同三个索引里,NHiberante将会使得业务大约起来。下边是一个User.hbm.xml的事例:

HashCodeProvider.dll

 

那七个文本。不用引用到程序。但nhibernate会使用到。

复制代码

将她们身处nhibernate相同的目录下就能够了,系统会招来后拷贝到bin\debug\上面。当然一直放进去也得以。

<?xml version=”1.0″ encoding=”utf-8″ ?>

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

<hibernate-mapping xmlns=”urn:nhibernate-mapping-2.2″
assembly=”NHibernate.Domain” namespace=”NHibernate.Domain”>

<generator class=”assigned” />

  <class name=”NHibernate.Domain.User,NHibernate.Domain”
table=”users” >

不然主键会加不进去

    <id name=”Id” column=”LogonId” type=”int” unsaved-value=”0″>

      <generator class=”increment”/>

    </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>

复制代码

让我们来探视那个文件中让我们感兴趣的某个行。第③个有趣的标签是class。那里咱们将映射类型名称到大家数据库中的User表,这里和Hibernate有一小点的不比。你将只好告诉NHibernate从哪个地方提取对象。

 

让咱们先跳过id标签,来讨论property标签。简要看一下,你将发现NHibernate所要做的劳作。name属性的值正是大家.net
类的习性,column属性值将是大家数据Curry的字段。type属性是可选的(假诺您不评释,NHibernate将选取反射进行最佳的估计)。

 

好了,让大家回来标签id,你可以测度到那么些标签将是炫耀数据库表的主键,的确如此,id标签的结缘和我们刚刚看的property标签是一般的。大家映射属性到目的数据库的字段。

内嵌的generator标签告诉NHibernate
怎样转移主键(它将适度的为您转移主键,不管你钦定何连串型,但您不能够不告诉它)。

 

提醒:请将user.hbm.xml的Build Action属性设置为Embedded Resource。

 

第伍步:为您的数据库产生三个配置文件

 

我们于今还不曾报告NHibernate
去哪儿连接数据库。最直白的艺术是在您的应用程序的配置文件里安装一个NHibernate配置节。那和在Hibernate里采取品质文件是等价的。如下配置(hibernate.cfg.xml):

 

复制代码

<?xml version=”1.0″ encoding=”utf-8″ ?>

<hibernate-configuration  xmlns=”urn:nhibernate-configuration-2.2″
>

  <session-factory name=”NHibernate.Test”>

    <property
name=”connection.driver_class”>NHibernate.Driver.SQLite20Driver</property>

    <property name=”connection.connection_string”>

      Data Source=..\output\test.db

    </property>

    <property
name=”dialect”>NHibernate.Dialect.SQLiteDialect</property>

    <property name=”show_sql”>true</property>

    <mapping assembly=”NHibernate.Domain” />

  </session-factory>

</hibernate-configuration>

复制代码

地点的例证里用了sqlite驱动,在本地连接名称为test的数据库,记得引用System.Data.SQLite.dll,不然运营时会报错。那里还有其余属性你须求调整来显明哪些让NHibernate来访问数据库。再度评释,你能够在文书档案里取得更加多新闻。

 

请留意上述的布局里并不曾关系到log4net的布局消息。NHibernate使用log4net来记录内部发生的方方面面。在1个应用程序产品里,在你一定环境里,作者引进配置log4net,并为NHibernate设置一定的日志级别。

 

第⑤步:伊始表现NHibernate的魅力

 

享有困难的做事早已实现。你将有以下内容

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

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

hibernate.cfg.xml
—-对数据库连接的配置信息(假使您愿意,你能够在代码中贯彻)。

您的数据Curry有一张User表。

 

到现在能够在你的代码中正好简洁的运用NHibernate。

为了让您更清楚,我们来看一些代码。

 

第1创设3个数据库连接类(NHibernateHelper.cs):

 

复制代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using NHibernate.Cfg;

 

namespace NHibernate.DataPortal

{

    class NHibernateHelper

    {

        private ISessionFactory sessionFactory;

 

        public NHibernateHelper()

        {

            sessionFactory = GetSessionFactory();

        }

 

        private ISessionFactory GetSessionFactory()

        {

            return (new
Configuration()).Configure().BuildSessionFactory();

        }

 

        public ISession GetSession()

        {

            return sessionFactory.OpenSession();

        }

    }

}

复制代码

NHibernate在建树数据库连接在此之前,须求读取配置文件,然后创制会话(ISession)。在对话中实现各个对数据库的支配。

 

然后建立3个数据库操作类(UserDal.cs):

 

复制代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using NHibernate.Domain;

 

namespace NHibernate.DataPortal

{

    public class UserDal

    {   

        private NHibernateHelper nhibernateHelper = new
NHibernateHelper();

 

        protected ISession Session { get; set; }

 

        public UserDal()

        {

            this.Session = nhibernateHelper.GetSession();

        }

 

        public UserDal(ISession session)

        {

            this.Session = session;

        }

 

        public void AddUser(User user)

        {

            var aa = Session.Save(user);

            Session.Flush();

        }

 

        public void DeleteUser(User user)

        {

            Session.Delete(user);

            Session.Flush();

        }

 

        public void UpdateUser(User user)

        {

            Session.Update(user);

            Session.Flush();

        }

 

        public IList<User> GetUsers()

        {

            return Session.QueryOver<User>().List();

        }

    }

}

相关文章

Your Comments

近期评论

    功能


    网站地图xml地图