【美高梅开户网址】net中选拔Nhibernate对数据库进行操作详细步骤

 C#—Nhibernate探索

从零开首在.net中接纳Nhibernate对数据库进行操作详细步骤

ADO.NET与O凯雷德M的比较:NHibernate实现CRUD 转自周公

【转发】ADO.NET与O凯雷德M的可比(二):NHibernate达成CRUD 
转自周公

本篇小说,让大家1同来商量Nhibernate。

从读书NhibernateE奥迪Q7P中,还获悉不单只ADO.NET能是兑现对数据库表展开操作,还有Nhibernate、Linq、EntityFramwork这一个技术。算本人管中窥豹吧。

证实:个人感觉在Java领域大型开发都离不了O宝马7系M的人影,所谓的SSH就是Spring+Struts+Hibernate,除了在攻读基础知识的时候被报告能够使用JDBC操作数据库之外,大批量的书本中都以描述使用Hibernate这些OCRUISERM工具来操作数据。在.NET中操作数据库的点子有各个,除了最直白的主意正是选取ADO.NET之外,还足以运用NHibernate这一个Hibernate在.NET中的达成OLANDM,如若你对第贰方的O奥迪Q3M持嫌疑态度,你仍是能够动用来源微软的贯彻、根正苗红的Linq或然EntityFramework。
大部从前期就初始使用.NET开发的程序员只怕对ADO.NET有种迷恋,使用ADO.NET能够尽管将大家最初的SQL知识发挥得透彻,并且由于对质量的设想,有个别人对.NET中的ORM还维持1种阅览态度,包罗自笔者要好也是那种态势。可是就算在实质上支付中不用,并不意味着我们无法去打听和比较这个技能,任何事物的面世和消逝总有其缘由的,咱们能够精通它们的亮点和优点。所以小编抽出了多少个礼拜2的年华独家用ADO.NET、NHibernate、Linq和EntityFramework来完毕对数据库单表数据的成立、读取、更新和删除操作,也正是所谓的CRUD(C:Create/PRADO:Read/U:Update/D:Delete)。
通过兑现均等效果的可比,大家温馨看清那种办法更符合自个儿。须要验证的是,如若在VS二零零六中应用EntityFramework就供给设置VS2010SP1。
在本篇周公将讲述怎么着使用NHibernate落成CRUD效能,为了便利比较,在本次中应用与上次同样的数据库和表,并且也落到实处平等的功用。NHibernate是三个O科雷傲M框架,所谓OLX570M正是Object
Relational
Mapping,是壹种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技能,大家得以想操作对象壹样操作数据,NHibernate将我们对指标的改观保存到数据库中去,并且还背负以指标的法子从数据库中查询数据,那样就可以使开发人士从拍卖SQL和ADO.NET上节省1些岁月和精力用于拍卖事务逻辑。
1、准备
率先大家要求从网上下载NHibernate框架,这一个能够到它的官方网址www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的新式版本为二.一.二.GA。若是下载的是压缩包,请将缩减包解压,将会看到五分文本夹,它们的名号和职能分别如下:
Configuration_Templates:存放NHibernate连接数据库的布置文件的以身作则,在那么些文件夹下分别有连接Firebird、SQL
Server、MySQL、Oracle、PostgreSQL和SQLite数据库的配备示范,能够根据实际所利用的数据库选用示例中的代码并改变内部的数据源即可。
Required_Bins:存放NHibernate运维进度中所供给的类库文件,当中还含有了第1方的开源日志框架Log四Net,在不明确到底会选用这么些类库的尺码下提议将那么些文件夹下全体的dll文件拷贝到项目标bin文件夹下。
Required_For_LazyLoading:存放延时加载特性帮忙所需的框架文件,在那一个文件夹下提供了两种实现,选用1种将其下拥有的dll文件拷贝到项目所在的bin文件夹下。在本示例中选择了Castle。
【美高梅开户网址】net中选拔Nhibernate对数据库进行操作详细步骤。Tests:存放测试用文件,在此文件夹下还有三个名称叫ABC.hbm.xml的公文,那是二个数据表对应的铺排文件的示范,在那个文件夹下的文书大家都用不着,然而在将来大家会用到.hbm.xml文件。
二、创立项目 咱俩创设三个连串,项目种类能够依据气象选拔,因为自身之后要运用NUnit来对项目开始展览单元测试,所以创设的类库项目。
创设项目中标之后将如下文件拷贝到项目标bin目录下:
Antlr3.Runtime.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
Iesi.Collections.dll
log4net.dll
NHibernate.ByteCode.Castle.dll
NHibernate.dll
接下来在项目中添加对那些dll的引用,如下图所示:
美高梅开户网址 1
三、编写代码
三.一创办NHibernate配置文件 NHibernate的安插文件有相对相比较固定的格式,这些能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目拉长贰个名字为hibernate.cfg.xml的xml文件,在周公的机械上这么些文件的格式内容如下:

表明:个人感觉在Java领域大型开发都离不了O奥迪Q5M的身材,所谓的SSH就是Spring+Struts+Hibernate,除了在求学基础知识的时候被告知能够利用JDBC操作数据库之外,大批量的书本中都是描述使用Hibernate这么些O索罗德M工具来操作数据。在.NET中操作数据库的章程有多样,除了最直白的措施正是利用ADO.NET之外,还是能够动用NHibernate那一个Hibernate在.NET中的完结O奔驰M级M,即便您对第1方的O凯雷德M持嫌疑态度,你还能使用来源微软的实现、根正苗红的Linq或许EntityFramework。
多数从最初就从头使用.NET开发的程序员恐怕对ADO.NET有种迷恋,使用ADO.NET能够丰盛将咱们最初的SQL知识发挥得不亦乐乎,并且由于对品质的设想,有个别人对.NET中的ORAV四M还维持一种观察态度,包罗本身要好也是那种姿态。可是即使在事实上支出中不用,并不表示大家不可能去询问和相比较那个技能,任何事物的产出和消退总有其缘由的,大家能够精通它们的帮助和益处和亮点。所以作者抽出了多少个礼拜2的岁月分别用ADO.NET、NHibernate、Linq和EntityFramework来兑现对数据库单表数据的创导、读取、更新和删除操作,也正是所谓的CRUD(C:Create/奥迪Q5:Read/U:Update/D:Delete)。
透过兑现均等效果的可比,大家本身判断那种办法更适合本身。需求证实的是,借使在VS2008中选拔EntityFramework就必要安装VS二〇一〇SP一。
在本篇周公将讲述怎样利用NHibernate实现CRUD功用,为了有利于相比,在此番中选用与上次壹律的数据库和表,并且也完成平等的意义。NHibernate是三个O宝马X3M框架,所谓OMuranoM正是Object
Relational
Mapping,是一种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技艺,我们能够想操作对象一样操作数据,NHibernate将大家对目的的变更保存到数据库中去,并且还承担以指标的法门从数据库中询问数据,那样就足以使开发人士从拍卖SQL和ADO.NET上节省1些时刻和生命力用于拍卖业务逻辑。
1、准备
率先大家须求从网上下载NHibernate框架,那一个能够到它的官方网址www.nhibernate.org上来下载,在周公写那篇小说的时候从网上能下载到的风靡版本为二.一.二.GA。假若下载的是压缩包,请将核减包解压,将会看到五分文本夹,它们的名称和成效分别如下:
Configuration_Templates:存放NHibernate连接数据库的安排文件的演示,在那个文件夹下分别有连接Firebird、SQL
Server、MySQL、Oracle、PostgreSQL和SQLite数据库的布局示范,能够依照实际所运用的数据库选拔示例中的代码并改变内部的数据源即可。
Required_Bins:存放NHibernate运维进度中所须求的类库文件,个中还含有了第一方的开源日志框架Log四Net,在不分明毕竟会利用那二个类库的标准下提出将以此文件夹下全部的dll文件拷贝到项指标bin文件夹下。
Required_For_LazyLoading:存放延时加载本性帮衬所需的框架文件,在这一个文件夹下提供了二种完毕,选取一种将其下有所的dll文件拷贝到项目所在的bin文件夹下。在本示例中甄选了Castle。
Tests:存放测试用文件,在此文件夹下还有一个名称叫ABC.hbm.xml的公文,那是一个数据表对应的配备文件的示范,在那么些文件夹下的文书大家都用不着,但是在后头大家会用到.hbm.xml文件。
2、创造项目 咱俩创造3个类型,项目类别可以依据情形选拔,因为自个儿随后要利用NUnit来对品种开始展览单元测试,所以创立的类库项目。
始建项目中标之后将如下文件拷贝到项目标bin目录下:
Antlr3.Runtime.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
Iesi.Collections.dll
log4net.dll
NHibernate.ByteCode.Castle.dll
NHibernate.dll
然后在项目中添加对那几个dll的引用,如下图所示:
美高梅开户网址 2 
三、编写代码
三.一创制NHibernate配置文件 NHibernate的配备文件有相对比较原则性的格式,那一个能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目增加一个名叫hibernate.cfg.xml的xml文件,在周公的机械上这么些文件的格式内容如下:

先是大家去寻找Nhibernate下载地址,如下链接所示。

刚学完Nhibernate,也折腾了1天才办好,就拿出去跟大家大快朵颐一下吗。

美高梅开户网址 3美高梅开户网址 4

美高梅开户网址 5美高梅开户网址 6

该版本大概是流行版,我下载的肆.0.肆.GA。在那之中GA意思笔者没搞领会。但是相应不主要。

首先大家必须领悟的是,NhibernateEKoleosP是O汉兰达M框架,所谓O奇骏M就是Object
Relational Mapping,是1种将关系型数据库中的数据与面向对象语言中目的建立映射关联的技艺。

<?xml version="1.0" encoding="utf-8" ?>  <hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >   <session-factory>    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>    <property name="connection.connection_string">     Data Source=zhou;Initial Catalog=AspNetStudy;User ID=sa;Password=jerry;    </property>    <property name="adonet.batch_size">10</property>    <property name="show_sql">true</property>    <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>    <property name="use_outer_join">true</property>    <property name="command_timeout">10</property>    <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>    <property name="proxyfactory.factory_class">     NHibernate.ByteCode.Castle.ProxyFactoryFactory,     NHibernate.ByteCode.Castle    </property>    <mapping assembly="NHibernateDemo"/>   </session-factory>  </hibernate-configuration>  
<?xml version="1.0" encoding="utf-8" ?>  
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >  
 <session-factory>  
  <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>  
  <property name="connection.connection_string">  
   Data Source=zhou;Initial Catalog=AspNetStudy;User ID=sa;Password=jerry;  
  </property>  
  <property name="adonet.batch_size">10</property>  
  <property name="show_sql">true</property>  
  <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>  
  <property name="use_outer_join">true</property>  
  <property name="command_timeout">10</property>  
  <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>  
  <property name="proxyfactory.factory_class">  
   NHibernate.ByteCode.Castle.ProxyFactoryFactory,  
   NHibernate.ByteCode.Castle  
  </property>  
  <mapping assembly="NHibernateDemo"/>  
 </session-factory>  
</hibernate-configuration>  

美高梅开户网址 7

View Code

View Code

剖析文件内容

用Nhibernate的利益是怎么着啊?使用Nhibernate操作数据库,大家能够像操作对象一样操作数据库,Nhibernate将大家对目的的变更保存到数据库中去,还担负以目的的措施从数据库中询问数据,好处便是可以使开发人士从拍卖数据库那里节省时间和生命力用于拍卖工作逻辑。

假使你也是行使SQL
Server200伍作为数据库的话,那么要求变更connection.connection_string中的数据库连接音信为你本机的连天音信,并且实际情状更改assembly的值为你眼下项目编写翻译后的次第集名称。
在此地还索要小心的是亟需将hibernate.cfg.xml的属性更改为复制属性改为始终复制,如下图所示:
美高梅开户网址 8
三.二创制映射文件
辉映文件包罗了指标/关系所急需的元数据,当中包蕴了所使用的持久化类和到数据库的投射。NHibernate就是通过炫耀文件知道怎样加载和存款和储蓄持久化对象。
在档次中加进叁个名字为UserInfo.hbm.xml的xml文件,那个xml文件的内容如下:

借使您也是运用SQL
Server200五作为数据库的话,那么需求变更connection.connection_string中的数据库连接音信为你本机的接二连三音讯,并且真实情况更改assembly的值为您眼下项目编译后的先后集名称。
在此处还索要留意的是需求将hibernate.cfg.xml的性质更改为复制属性改为始终复制,如下图所示:
美高梅开户网址 9 
三.二创建映射文件
辉映文件包涵了对象/关系所急需的元数据,当中饱含了所接纳的持久化类和到数据库的照耀。NHibernate正是通过照射文件知道什么加载和存款和储蓄持久化对象。
在品种中加进3个名叫UserInfo.hbm.xml的xml文件,那一个xml文件的内容如下:

下载达成后,解压缩,我们来看文件夹内容如下图所示。

大家选用的Nhibernate框架,能够再官网上找到,www.nhibernate.org
或许csdn找咯。作者那边用的本子是2.一.二.GA 。

美高梅开户网址 10美高梅开户网址 11

美高梅开户网址 12美高梅开户网址 13

 美高梅开户网址 14

①、Nhibernate目录下的内容

<?xml version="1.0" encoding="utf-8" ?>  <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemo" namespace="NHibernateDemo">   <class name="UserInfo">    <id name="UserId" column="UserId">     <generator class="native"/>    </id>    <property name="UserName"/>    <property name="RealName"/>    <property name="Age"/>    <property name="Sex"/>    <property name="Mobile"/>    <property name="Phone"/>    <property name="Email"/>   </class>  </hibernate-mapping> 
<?xml version="1.0" encoding="utf-8" ?>  
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernateDemo" namespace="NHibernateDemo">  
 <class name="UserInfo">  
  <id name="UserId" column="UserId">  
   <generator class="native"/>  
  </id>  
  <property name="UserName"/>  
  <property name="RealName"/>  
  <property name="Age"/>  
  <property name="Sex"/>  
  <property name="Mobile"/>  
  <property name="Phone"/>  
  <property name="Email"/>  
 </class>  
</hibernate-mapping> 

我们得以分析得出,个中Required_Bins存款和储蓄的是类库和别的能源;字面包车型客车意思Required,是必须文件。

美高梅开户网址 15

View Code

View Code

打开Required文件夹,大家看看里面是那样的。

1、Configuration_Templates:存放Nhibernate连接数据库的布署文件的言传身教

注意:要是想要获得在编辑hibernate.cfg.xml可能UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的1个差异平日文件夹中,在本机前一周公在C盘安装了VS200玖,那么须要将方面提到的文件拷贝到C:/Program
Files/Microsoft Visual Studio
九.0/Xml/Schemas目录下,你供给依照你的实际意况来拷贝。
急需改变那个文件的天性,改为“嵌入的能源”,如下图所示:

注意:倘若想要获得在编写hibernate.cfg.xml恐怕UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的1个例外文件夹中,在本机前一周公在C盘安装了VS2010,那么须要将上边提到的文书拷贝到C:/Program
Files/Microsoft Visual Studio
玖.0/Xml/Schemas目录下,你要求依照你的其实际处景况来拷贝。
亟待变更那几个文件的质量,改为“嵌入的财富”,如下图所示:
 
三.3创办持久化类 在近期项目中开创二个名叫UserInfo.cs的类公事,这么些类的代码如下:

美高梅开户网址 16

美高梅开户网址 17

3.三创办持久化类 在此时此刻项目中开创三个名称叫UserInfo.cs的类公事,那一个类的代码如下:

美高梅开户网址 18美高梅开户网址 19

此间有八个类库;能够分析得出,那七个类库是要被引述的。

依照实制所用的数据库选用示例中的代码并改变内部的数据源即可。

美高梅开户网址 20美高梅开户网址 21

using System;  
using System.Collections.Generic;  
using System.Text;  

namespace NHibernateDemo  
{  
    /// <summary>   
    /// 数据库中UserInfo表的持久化类   
    /// 作者:周公   
    /// 博客地址:http://blog.csdn.net/zhoufoxcn   
    /// 日期:2010-03-19   
    /// </summary>   
    public class UserInfo  
    {  
        public virtual int UserId { get; set; }  
        public virtual string UserName { get; set; }  
        public virtual string RealName { get; set; }  
        public virtual int Age { get; set; }  
        public virtual bool Sex { get; set; }  
        public virtual string Mobile { get; set; }  
        public virtual string Phone { get; set; }  
        public virtual string Email { get; set; }  
    }  
}  

类库拥有相应的XML,没找到实际应用该XML的方法。所以一时半刻不去理她。

2、Required_Bins:存放Nhibernate运维过程中所须要的类库文件(dll)

using System;  using System.Collections.Generic;  using System.Text;    namespace NHibernateDemo  {      /// <summary>       /// 数据库中UserInfo表的持久化类       /// 作者:周公       /// 博客地址:http://blog.csdn.net/zhoufoxcn       /// 日期:2010-03-19       /// </summary>       public class UserInfo      {          public virtual int UserId { get; set; }          public virtual string UserName { get; set; }          public virtual string RealName { get; set; }          public virtual int Age { get; set; }          public virtual bool Sex { get; set; }          public virtual string Mobile { get; set; }          public virtual string Phone { get; set; }          public virtual string Email { get; set; }      }  }  

View Code

NHibernate.pdb应该是未有用的。估算是小编忘记删除了。

美高梅开户网址 22

View Code

小心:NHibernate通过运用性质的getter和setter操作来贯彻目的的持久化,并且须要类不能够为sealed,方法和总体性必须为virtual。
3.四编辑帮助类 透过下边包车型地铁公文NHibernate就足以兑现关系映射了,那里编写相关的帮忙类代码,如下:

nhibernate-configuration.xsd和nhibernate-mapping.xsd五个文本暂且不通晓要怎么用的。

内部还隐含第一方的开源日志框架Log四Net,这么些框架主要用以记录程序日志新闻。()

只顾:NHibernate通过选用品质的getter和setter操作来贯彻指标的持久化,并且要求类不能够为sealed,方法和质量必须为virtual。
三.四编纂援救类 经过地方的文本NHibernate就能够实现关系映射了,那里编写相关的援救类代码,如下:

美高梅开户网址 23美高梅开户网址 24

但看到.xsd文件,第一时间反应,他们相应是用来援救开发者,急速变化配置文件用的。为了保险起见,大家上网查询一下。

3、Required_For_LazyLoading:存放延时加载性格帮助所需的框架文件,在那么些文件夹下提供了两种达成,选择之中一种将其独具的dll文件引用到项目中去。在本实例中选取了Castle

美高梅开户网址 25美高梅开户网址 26

using System;  
using System.Collections.Generic;  
using System.Text;  
using Iesi.Collections;  
using NHibernate;  
using NHibernate.Cfg;  

namespace NHibernateDemo  
{  
    /// <summary>   
    /// 说明:这个类是为了演示NHibernate中的CRUD的用法   
    /// 作者:周公(周金桥)   
    /// 日期:2010-03-07   
    /// </summary>   
    public class NHibernateCRUD  
    {  
        private ISessionFactory sessionFactory;  
        public NHibernateCRUD()  
        {  
            sessionFactory = new Configuration().Configure().BuildSessionFactory();  
        }  

        public ISession GetSession()  
        {  
            return sessionFactory.OpenSession();  
        }  
        /// <summary>   
        /// 统计用户总数   
        /// </summary>   
        /// <returns></returns>   
        public int Count()  
        {  
            #region 方法一   
            //ISession session = GetSession();   
            //ISQLQuery query = session.CreateSQLQuery("select count(1) from UserInfo");   
            //int count = query.List<int>()[0];   
            //session.Close();   
            //return count;  
            #endregion  

            #region 方法二   
            ISession session = GetSession();  
            IQuery query = session.CreateQuery("select count(c.UserId) from UserInfo c");  
            //注意:不能对于count函数不能使用query.List<int>(),因为默认返回的数值类型是long   
            //否则会抛出GenericADOException,异常描述是:Could not execute query[SQL: SQL not available]   
            //InnerException: System.ArgumentException,InnerException描述是:"值“*”不是“System.Int32”类型,不能在此泛型集合中使用。/r/n参数名: value   
            int count =(int)(query.List<long>()[0]);  
            session.Close();  
            return count;  
            #endregion   
        }  
        /// <summary>   
        /// 创建用户   
        /// </summary>   
        /// <param name="info">用户实体</param>   
        /// <returns></returns>   
        public int Create(UserInfo info)  
        {  
            ISession session = GetSession();  
            int newId=(int)(session.Save(info));  
            session.Flush();  
            session.Close();  
            return newId;  
        }  
        /// <summary>   
        /// 读取用户信息   
        /// </summary>   
        /// <param name="userId">用户编号</param>   
        /// <returns></returns>   
        public UserInfo Read(int userId)  
        {  
            ISession session = GetSession();  
            UserInfo info=session.Get<UserInfo>(userId);  
            session.Close();  
            return info;  
        }  
        /// <summary>   
        /// 更新用户信息   
        /// </summary>   
        /// <param name="info">用户实体</param>   
        /// <returns></returns>   
        public void Update(UserInfo info)  
        {  
            ISession session = GetSession();  
            session.Update(info);  
            session.Flush();  
            session.Close();  
        }  
        /// <summary>   
        /// 删除用户   
        /// </summary>   
        /// <param name="userId">用户编号</param>   
        /// <returns></returns>   
        public void Delete(int userId)  
        {  
            ISession session = GetSession();  
            //在NHibernate中支持直接使用参数值、":"+参数名、?(类似于在Access中使用参数化SQL语句的方式,给参数赋值要按照参数出现的顺序来)等几种方式   
            IQuery query = session.CreateQuery("delete from UserInfo where UserId=:UserId");  
            //如果采用":"+参数名方式使用参数,那么给参数赋值时不需要在参数名前加":"号,如query.SetInt32(":UserId", userId);就会报错   
            query.SetInt32("UserId", userId);  
            int affectedRows = query.ExecuteUpdate();  
            session.Close();  
            //return affectedRows;   
        }  

        /// <summary>   
        /// 删除用户   
        /// </summary>   
        /// <param name="userId">用户实体</param>   
        /// <returns></returns>   
        public void Delete(UserInfo info)  
        {  
            ISession session = GetSession();  
            session.Delete(info);  
            session.Flush();  
            session.Close();  
        }  

        /// <summary>   
        /// 获取用户表中编号最大的用户   
        /// </summary>   
        /// <returns></returns>   
        public int GetMaxUserId()  
        {  
            ISession session = GetSession();  
            IQuery query=session.CreateQuery("select max(UserId) from UserInfo");  
            int userId=query.List<int>()[0];  
            session.Close();  
            return userId;  
        }  
    }  
}  

询问结果:

Castel的着力是个轻量级容器,完成了IoC情势的器皿,基于此基本容器所创设的应用程序,能够完毕程序组件的松散耦合,让程序组件能够拓展测试,这一个特色都使得整个应用程序能够再架构上与爱抚上都能取得相当程度的简化。(来自百度

using System;  using System.Collections.Generic;  using System.Text;  using Iesi.Collections;  using NHibernate;  using NHibernate.Cfg;    namespace NHibernateDemo  {      /// <summary>       /// 说明:这个类是为了演示NHibernate中的CRUD的用法       /// 作者:周公       /// 日期:2010-03-07       /// </summary>       public class NHibernateCRUD      {          private ISessionFactory sessionFactory;          public NHibernateCRUD()          {              sessionFactory = new Configuration().Configure().BuildSessionFactory();          }            public ISession GetSession()          {              return sessionFactory.OpenSession();          }          /// <summary>           /// 统计用户总数           /// </summary>           /// <returns></returns>           public int Count()          {              #region 方法一               //ISession session = GetSession();               //ISQLQuery query = session.CreateSQLQuery("select count from UserInfo");               //int count = query.List<int>()[0];               //session.Close();               //return count;              #endregion               #region 方法二               ISession session = GetSession();              IQuery query = session.CreateQuery("select count from UserInfo c");              //注意:不能对于count函数不能使用query.List<int>(),因为默认返回的数值类型是long               //否则会抛出GenericADOException,异常描述是:Could not execute query[SQL: SQL not available]               //InnerException: System.ArgumentException,InnerException描述是:"值“*”不是“System.Int32”类型,不能在此泛型集合中使用。/r/n参数名: value               int count =(int)(query.List<long>()[0]);              session.Close();              return count;              #endregion           }          /// <summary>           /// 创建用户           /// </summary>           /// <param name="info">用户实体</param>           /// <returns></returns>           public int Create(UserInfo info)          {              ISession session = GetSession();              int newId=(int)(session.Save;              session.Flush();              session.Close();              return newId;          }          /// <summary>           /// 读取用户信息           /// </summary>           /// <param name="userId">用户编号</param>           /// <returns></returns>           public UserInfo Read(int userId)          {              ISession session = GetSession();              UserInfo info=session.Get<UserInfo>;              session.Close();              return info;          }          /// <summary>           /// 更新用户信息           /// </summary>           /// <param name="info">用户实体</param>           /// <returns></returns>           public void Update(UserInfo info)          {              ISession session = GetSession();              session.Update;              session.Flush();              session.Close();          }          /// <summary>           /// 删除用户           /// </summary>           /// <param name="userId">用户编号</param>           /// <returns></returns>           public void Delete(int userId)          {              ISession session = GetSession();              //在NHibernate中支持直接使用参数值、":"+参数名、?(类似于在Access中使用参数化SQL语句的方式,给参数赋值要按照参数出现的顺序来)等几种方式               IQuery query = session.CreateQuery("delete from UserInfo where UserId=:UserId");              //如果采用":"+参数名方式使用参数,那么给参数赋值时不需要在参数名前加":"号,如query.SetInt32(":UserId", userId);就会报错               query.SetInt32("UserId", userId);              int affectedRows = query.ExecuteUpdate();              session.Close();              //return affectedRows;           }            /// <summary>           /// 删除用户           /// </summary>           /// <param name="userId">用户实体</param>           /// <returns></returns>           public void Delete(UserInfo info)          {              ISession session = GetSession();              session.Delete;              session.Flush();              session.Close();          }            /// <summary>           /// 获取用户表中编号最大的用户           /// </summary>           /// <returns></returns>           public int GetMaxUserId()          {              ISession session = GetSession();              IQuery query=session.CreateQuery("select max from UserInfo");              int userId=query.List<int>()[0];              session.Close();              return userId;          }      }  }   

View Code

查询结果是,他们俩是【文件智能提示功用】用的。

四、Tests:存放测试试用文件,在此文件夹下有二个名叫ABC.bhm.xml的文本,那些是数据表对应配置文件的言传身教。

View Code

三.5单元测试代码

且nhibernate-configuration.xsd和nhibernate-mapping.xsd是要放权c盘的,路径如下:

2、开端创制第一个程序测试和铺排

3.5单元测试代码

美高梅开户网址 27美高梅开户网址 28

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas

一、 首先在数据库创造我们的表,表结构如下:

美高梅开户网址 29美高梅开户网址 30

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using NUnit.Framework;  
using NHibernateDemo;  

namespace NUnitTest  
{  
    [TestFixture]  
    public class NHibernateTest  
    {  
        private NHibernateCRUD instance = null;  
        [SetUp]  
        public void Initialize()  
        {  
            instance = new NHibernateCRUD();  
        }  
        [Test]  
        /// <summary>   
        /// 统计用户总数   
        /// </summary>   
        /// <returns></returns>   
        public void Count()  
        {  
            Assert.Greater(instance.Count(), 0);  
        }  
        [Test]  
        /// <summary>   
        /// 创建用户   
        /// </summary>   
        /// <param name="info">用户实体</param>   
        /// <returns></returns>   
        public void Create()  
        {  
            UserInfo info = new UserInfo()  
            {  
                Age = 12,  
                Email = "zzz@ccav.com",  
                Mobile = "13812345678",  
                Phone = "01012345678",  
                RealName = "测试" + DateTime.Now.Millisecond.ToString(),  
                Sex = true,  
                UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()  
            };  
            instance.Create(info);  
        }  
        [Test]  
        /// <summary>   
        /// 读取用户信息   
        /// </summary>   
        /// <param name="userId">用户编号</param>   
        /// <returns></returns>   
        public void Read()  
        {  
            UserInfo info = instance.Read(1);  
            Assert.NotNull(info);  
        }  
        [Test]  
        /// <summary>   
        /// 更新用户信息   
        /// </summary>   
        /// <param name="info">用户实体</param>   
        /// <returns></returns>   
        public void Update()  
        {  
            UserInfo info = instance.Read(1);  
            info.RealName = "测试" + DateTime.Now.Millisecond.ToString();  
            instance.Update(info);  
        }  
        [Test]  
        /// <summary>   
        /// 删除用户   
        /// </summary>   
        /// <param name="userId">用户编号</param>   
        /// <returns></returns>   
        public void DeleteByID()  
        {  
            int userId = instance.GetMaxUserId();  
            instance.Delete(userId);  
        }  

        [Test]  
        /// <summary>   
        /// 删除用户   
        /// </summary>   
        /// <param name="userId">用户实体</param>   
        /// <returns></returns>   
        public void Delete()  
        {  
            int userId = instance.GetMaxUserId();  
            UserInfo info = instance.Read(userId);  
            Console.WriteLine("MaxUserId=" + userId);  
            instance.Delete(info);  
        }  
    }  
}  

因为是自家用的是vs二〇一一,所以,小编找的门径是Microsoft Visual Studio
11.0。并将文件放在了那里面。

我们先创建二个名称叫E大切诺基P的数据库,建表,表名:Person

using System;  using System.Collections.Generic;  using System.Linq;  using System.Text;  using NUnit.Framework;  using NHibernateDemo;    namespace NUnitTest  {      [TestFixture]      public class NHibernateTest      {          private NHibernateCRUD instance = null;          [SetUp]          public void Initialize()          {              instance = new NHibernateCRUD();          }          [Test]          /// <summary>           /// 统计用户总数           /// </summary>           /// <returns></returns>           public void Count()          {              Assert.Greater(instance.Count(), 0);          }          [Test]          /// <summary>           /// 创建用户           /// </summary>           /// <param name="info">用户实体</param>           /// <returns></returns>           public void Create()          {              UserInfo info = new UserInfo()              {                  Age = 12,                  Email = "zzz@ccav.com",                  Mobile = "13812345678",                  Phone = "01012345678",                  RealName = "测试" + DateTime.Now.Millisecond.ToString(),                  Sex = true,                  UserName = "zhoufoxcn" + DateTime.Now.Millisecond.ToString()              };              instance.Create;          }          [Test]          /// <summary>           /// 读取用户信息           /// </summary>           /// <param name="userId">用户编号</param>           /// <returns></returns>           public void Read()          {              UserInfo info = instance.Read(1);              Assert.NotNull;          }          [Test]          /// <summary>           /// 更新用户信息           /// </summary>           /// <param name="info">用户实体</param>           /// <returns></returns>           public void Update()          {              UserInfo info = instance.Read(1);              info.RealName = "测试" + DateTime.Now.Millisecond.ToString();              instance.Update;          }          [Test]          /// <summary>           /// 删除用户           /// </summary>           /// <param name="userId">用户编号</param>           /// <returns></returns>           public void DeleteByID()          {              int userId = instance.GetMaxUserId();              instance.Delete;          }            [Test]          /// <summary>           /// 删除用户           /// </summary>           /// <param name="userId">用户实体</param>           /// <returns></returns>           public void Delete()          {              int userId = instance.GetMaxUserId();              UserInfo info = instance.Read;              Console.WriteLine("MaxUserId=" + userId);              instance.Delete;          }      }  }  

View Code

固然感觉,那俩文件好像不是那般用的,但出于能够看清它们并不影响程序运转,所以,先且不管他们,等程序运维起来后,再删除他们尝试。

美高梅开户网址 31

View Code

4.点评 行使OMuranoM的非常的大的三个益处便是很少大概根本并非编写数据库记录映射到指标的代码,并且在大部动静下也不用编写SQL代码(取而代之的是HSQL)。在应用ADO.NET时代作者时常有诸如此类的认知,因为数据库的更动恐怕供给改变从出示到数据库访问层的相关代码,并且还索要变更自个儿编写的从数据库记录转换为目的的代码,而后天单纯供给更改映射文件和持久化类的代码就足以了,除此而外大家还足以选用面向对象的艺术对数码举行操作,大家能够看出在NHibernateCRUD中对数据库实行CRUD的代码比直接行使ADO.NET实行CRUD操的代码要言必有中许多,那正是OLX570M的魔力。
理所当然使用O汉兰达M也会设有有的毛病,究竟OPAJEROM在后面部分使用的是ADO.NET,对于多个有经验的开发人士来说,只怕一向运用ADO.NET的质量比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上缓解这一个题材。不过当数据量在相对级左右时这些标题就显得相比较出色了,在某些数据量在百万级以下的景观中,合理运用NHibernate是从未怎么难点的。

 

把之类语句在数据库执行就好了:

4.点评 动用O福睿斯M的不小的三个好处就是很少依旧根本不用编写数据库记录映射到对象的代码,并且在大部分情状下也不用编写SQL代码(取而代之的是HSQL)。在利用ADO.NET时期作者时常有那样的体会,因为数据库的改动恐怕须求转移从出示到数据库访问层的有关代码,并且还索要变更自个儿编排的从数据库记录转换为对象的代码,而以后不过须求更改映射文件和持久化类的代码就能够了,除却大家还足以采纳面向对象的艺术对数码进行操作,大家能够看来在NHibernateCRUD中对数据库举行CRUD的代码比直接利用ADO.NET举办CRUD操的代码要精简许多,那正是O奥迪Q五M的吸重力。
本来使用OHighlanderM也会设有有的瑕疵,毕竟O奥迪Q3M在尾部使用的是ADO.NET,对于3个有经历的开发职员来说,或然一直运用ADO.NET的品质比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上缓解那一个难点。不过当数据量在相对级左右时那一个标题就显得相比杰出了,在某些数据量在百万级以下的事态中,合理利用NHibernate是不曾怎么难点的。

再后来,作者上网查证了下Nhibernate的选取。

美高梅开户网址 32美高梅开户网址 33View Code

上网查证后,发现Nhibernate有Castle框架、LinFu框架、Spring.Net两种。

USE [ERP]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

CREATE TABLE [dbo].[Person](

[ID] [int] IDENTITY(1,1) NOT NULL,

[UserID] [int] NULL,

[UserName] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[BirtherDate] [datetime] NULL,

[Height] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,

[Sex] [int] NULL,

CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED

(

[ID] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

) ON [PRIMARY]

看起来很复杂,小说有诸多,写的又很复杂,于是作者割舍调查,直接尝试使用,首先第二步,直接引用类库。

 

 

3、创设二个消除方案命名称叫NH伊比rnateEPRADOP

壹、建立了三个类库程序,引用Iesi.Collections.dll和NHibernate.dll八个DLL。 

美高梅开户网址 34

接下去,我们开端树立持久化对象。

一、在解决方案添加多个项目,分别为DAL,DomainModel,WebApp

public class Test 
 { 
        public virtual int Id { get; set; } 
        public virtual string Name { get; set; } 
}

一)
在类型DomainModel中分头见七个目录,Entities和Mappings从马虎上我们能够通晓,

接下去建立持久化对象与数据库的投射。再一次上网查证。

Entities是放实体类的(持久化类),Mapping是热映射对象。

考查结果:

持久化类:是指其实例要求被Hibernate持久化到数据库中的类。持久化类包涵部分属性,有get和set,且属性名的首字母为大写。

指标与数据库的映射是保存在XML文件中的,于是小编安排XML映射文件如下。

美高梅开户网址 35

该XML文件的属性,须求安装其生成操作为【嵌入的财富】。

首先大家把Iesi.Collections文件引用进来。

但作者怕它丢失,还给她安装了平昔复制的性质。

Lesi.Collection类库功能也正是昨日的Linq,提供集合运算成效,且协助泛型。那里我们选取它
在多少个集聚里取相同部分的效率。

XML文件如下:

2)、【Entities】下建立Person类

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
   assembly="NherbinateHelper"
   namespace="NherbinateHelper">
  <class name ="Test">
    <id name="Id" column ="Id">
      <generator class ="native"/>
    </id>
    <property name ="Name"/>
  </class>
</hibernate-mapping>

代码如下,大家只供给涵盖get和set,属性的首字母要大写

再然后,小编急需建立数据库连接的类。

美高梅开户网址 36美高梅开户网址 37View Code

双重上网查证。编写NHibernateHelper如下。

public class Person

{

public virtual int ID { get; set; }

public virtual int UserID { get; set; }

public virtual string UserName { get; set; }

public virtual DateTime BirtherDate { get; set; }

public virtual float Height { get; set; }

public virtual bool Sex { get; set; }

}
 public class NHibernateHelper
    {
        private ISessionFactory _sessionFactory;
        public NHibernateHelper()
        {
            _sessionFactory = GetSessionFactory();
        }
        private ISessionFactory GetSessionFactory()
        {
            return (new Configuration()).Configure().BuildSessionFactory();
        }
        public ISession GetSession()
        {
            return _sessionFactory.OpenSession();
        }
}

 

因为大家一直不突显设置数据库连接字符串,所以,借使程序能够运作,那么那一个类,一定会读配置文件中SQL字符串连接。

三)、【Mappings】下建立映射文件Person.hbm.xml,注意Person是对应上边实体类的称呼,必须以.hbm.xml为后缀名。我们得以参考Nhibernate包里面包车型地铁实例Tests文件夹里面包车型地铁ABC.hbm.xml。假如想在编写制定时候有智能提示的,能够把【Required_Bins】目录下的

然后,大家建立domain(域),添加对Text持久化对象的增加和删除改查的主意。

美高梅开户网址 38

public class NHibernateSample
    {
        protected ISession Session { get; set; }
        public NHibernateSample(ISession session)
        {
            Session = session;
        }
        public void CreateCustomer(Test test)
        {
            Session.Save(test);
            Session.Flush();
        }
        public Test GetCustomerById(int Id)
        {
            return Session.Get<Test>(Id);
        }
    }

[Nhibernate-configuration.xsd]和[nhibernate-mapping.xsd]多个文本拷贝到VS
的装置目录/Microsoft Visual Studio
10.0/Xml/Schemas下,就足以有智能指示了。

再然后,大家新建一个控制台程序,用于测试大家编辑的那么些NHibernate,是或不是能够正常运营。

美高梅开户网址 39美高梅开户网址 40View Code

编写测试类代码如下。

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DomainModel" namespace="DomainModel">

<class name="DomainModel.Entities.Person,DomainModel" table="Person">

//name=类的全名,命名空间 table=表名

<id name="ID" column="ID">

<generator class="native" />

</id>

<property name="UserID" column="UserID" />

// name=属性名 cloumn=字段名称

<property name="UserName" column="UserName" />

<property name="BirtherDate" column="BirtherDate" />

<property name="Height" column="Height" />

<property name="Sex" column="Sex" />

</class>

</hibernate-mapping>
public class NHibernateSampleFixture
{
        private NHibernateSample _sample;
        public NHibernateSampleFixture()
        {
            _sample = new NHibernateSample(new  NHibernateHelper().GetSession());
        }
        public void GetCustomerByIdTest()
        {
            var tempCutomer = new Test {  Name = "李" };
            _sample.CreateCustomer(tempCutomer);
            Test customer = _sample.GetCustomerById(1);
            int customerId = customer.Id;
        }
}

 

main函数调用如下:

留意,属性名必须跟实体类的天性名相同,注意分寸写,字段名必须对应Person表的字段,注意分寸写。

class Program 
    { 
        static void Main(string[] args) 
        { 
            NHibernateSampleFixture f = new NHibernateSampleFixture(); 
            f.GetCustomerByIdTest(); 
        } 
}

在配置完这些文件之后,要小心关键的一步,把【Person.hbm.xml】文件的属性

测试结果是战败,因为,大家还从未在其他地方设置数据库连接字符串。所以估测计算,缺乏了安顿数据库连接的文书。

复制到输出目录:始终复制

跟着,笔者打开文件夹了Configuration_Templates。

浮动操作:嵌入的能源

发现Configuration_Templates文件夹下有如下文件。

美高梅开户网址 41

 美高梅开户网址 42

美高梅开户网址 ,在做到地点的操作之后把该项素不相识成以下。

自己想来,那里正是数据库连接字符串的沙盘。

2、在DAL项目中,引用须要的dll文件,包蕴以下

鉴于自家利用的数据库是sqlserver,所以,小编复制了mssql.cfg.xml。

美高梅开户网址 43

然后将复制的文书,黏贴到测试的控制台程序下,然后改名字为《hibernate.cfg.xml》。

首如若:DomainModel(上3个连串转移的dll文件),Iesi.Collections,Nhibernate,nunit.framework

那里测试了下,貌似不改名不佳使,配置文件内容如下

在此处大家抬高贰个NhibernateHelper.cs类,这几个类重点是帮助上面PersonHQ.cs,获取Isession.代码如下:

【PS:作者平素没搞懂,XML中的CFG代表如何看头。】

美高梅开户网址 44美高梅开户网址 45View Code

<?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.SqlClientDriver</property> 
        <property name="connection.connection_string"> 
      Server=SKY-20160718RXO\SA;initial catalog=Nherbinate;Integrated Security=SSPI; 
    </property> 
        <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property> 
    <mapping assembly="NherbinateHelper"/> 
  </session-factory> 
</hibernate-configuration>
public class NHinbernateHelper

{

//

private ISessionFactory _sessionfacotry;

//构造函数,在new这个类的时候就调用GetSessionFactory这个方法获取到ISessionFactory

public NHinbernateHelper()

{

_sessionfacotry = GetSessionFactory();

}

private ISessionFactory GetSessionFactory()

{

Configuration cfg = new Configuration();

ISessionFactory sf =

cfg.Configure().BuildSessionFactory();

return sf;

}

//获得Isession

public ISession GetSession()

{

ISession session = _sessionfacotry.OpenSession();

return session;

}

}

因为本人再而三的是sqlserver二〇一三,所以布置文件里,笔者将原始版SQL二〇〇八的property
修改为

 

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

接下来再添加二个PersonHQL.cs类,完结增加和删除改查,还有分页查询格局。

注意

PersonHQL.cs类的代码如下:

里面<mapping assembly=”NherbinateHelper”/>是后加的,最初的文章件里不曾。

美高梅开户网址 46美高梅开户网址 47View Code

那句话的情致是,映射我创立的十分类库。

public class PersonHQL

{

private ISession _session;

public ISession Session

{

get

{

return _session;

}

}

//构造函数,在new这个类的时候,需要传一个ISession参数

public PersonHQL(ISession session)

{

_session = session;

}

//增加一条记录

/// <summary>

/// 增加记录

/// </summary>

/// <param name="person">Person实体</param>

/// <returns>int</returns>

public int CreatePerson(Person person)

{

int newid = (int)_session.Save(person);

_session.Flush();

return newid;

}

//删除一条记录

/// <summary>

/// 删除记录

/// </summary>

/// <param name="person">Person实体</param>

/// <returns>bool</returns>

public bool DeletePerson(Person person)

{

_session.Delete(person);

_session.Flush();

return true;

}

//更新一条记录

/// <summary>

/// 更新记录

/// </summary>

/// <param name="person">Person实体</param>

/// <returns>无返回值</returns>

public void UpdatePerson(Person person)

{

_session.Update(person);

_session.Flush();

}

//获取Person整张表的数据

/// <summary>

/// 获取整张Person的记录

/// </summary>

/// <param>无参数</param>

/// <returns>IList<Person></returns>

public IList<Person> GetList()

{

return _session.CreateQuery("from Person").List<Person>();

}

//把查询某一段的数据,pagesize是第几条记录开始从0开始记起,pageindex读取多少条记录

/// <summary>

/// 查询某一段的记录

/// </summary>

/// <param name="pagesize">开始的位置</param>

/// <param name="pageindex">记录数量</param>

/// <returns>IList<Person></returns>

public IList<Person> GetList(int pagesize, int pageindex)

{

return _session

.CreateQuery("from Person")

.SetFirstResult(pagesize)

.SetMaxResults(pageindex)

.List<Person>();

}

//每个页面10条记录,参数page为第几页从1开始

/// <summary>

/// 以每页为10条记录,查询第几页的记录,从1开始

/// </summary>

/// <param name="page">第几页</param>

/// <returns>IList<Person></returns>

public IList<Person> GetList(int page)

{

IList<Person> pers=GetList();

return GetList((page-1)*10, 10);//第二个参数为每页的记录数量

}

//读取某条记录

/// <summary>

/// 读取

/// </summary>

/// <param name="ID">ID</param>

/// <returns></returns>

public Person GetPerson(int id)

{

var result = from c in this.GetList()

where c.ID == id

select c;

return result.First();

}

//读取某条记录

/// <summary>

/// 读取

/// </summary>

/// <param name="ID">ID</param>

/// <returns></returns>

public Person Read(int id)

{

Person person = _session.Get<Person>(id);

_session.Close();

return person;

}

}

本人想来,Nherbinate是读那么些布局文件,然后到这些顺序集里,反射查询那个poco对象。

 

最后,nhibernate-configuration-二.二那句话小编想了很久要不要改成4.0。

形成上述的步骤,然后生成以下改项目。

结果是自个儿没改,测试一切符合规律。能够顺利使用。

3、在WebApp项目中,添加dll文件

 结语

美高梅开户网址 48

那是一场Nhibernate探索之旅,结果是相当顺畅的布置成功了。共耗费时间二小时。

驷不比舌不外乎上述圈着的文件,在Nhibernate包里能找到。DAL和DomainMode是上五个项目转移的dll文件。

缘何正是探索之旅呢,因为,作者也是第三回配置Nhibernate,作者平时越多的是选取Entity
Framework。

1) 在此地大家须求配备叁个文书

文中使用了有些臆度,预计的辞藻。那是因为,真的是在测算的。笔者并不了然那个点的规律和含义,因为本人没看Nhibernate的原代码。

美高梅开户网址 49

就算如此本文是描述,配置Nhibernate;但自小编更想讲述的是,面对未知的框架动手学习和应用的方法。

【Hibernate.cfg.xml】这些文件在Nhibernate包里面包车型地铁【Configuration_Templates】目录,找相应的文书,大家选择的是SQL
Server所以把MSSQL.cfg.xml文件复制过来。最佳把复制过来的文本名改一下,假使不改为hibernate.cfg.xml,在末端获取Isession时要把文件名引用进来,如下不相同:

自笔者叙述了本身一步一步配置Nhibernate的路径,小编以为还算高效,我们也足以效仿,用来上学不熟悉框架。

Configuration cfg = new
Configuration().configure();//以hibernate.cfg.xml为文件名

当然不必太追求速度,因为每一个人的基础不1样。笔者相比熟练Entity
Framework。所以读书Nhibernate就会比较快。

Configuration cfg = new Configuration().configure(“文件名”);//内定文件名

借使您还没接触过OCRUISERM,那本来就会慢一点。

ISessionFactory factory = cfg.buiddSessionfactory();

 

ISession session = factory.openSession();


在hibernate.cfg.xml文件中,大家须要注意的是:

注:此文章为原创,欢迎转发,请在小说页面显著地方给出此文链接!
若您觉得这篇小说还不易,请点击下右下角的推荐,分外谢谢!

美高梅开户网址 50美高梅开户网址 51View Code

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >

<session-factory name="WebApp">

<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

<property name="connection.connection_string">

Data Source=.;Initial Catalog=ERP;User ID=sa;Password=123456

</property>

<property name="adonet.batch_size">10</property>

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

<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>

<property name="use_outer_join">true</property>

<property name="command_timeout">10</property>

<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>

<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu</property>

<property name="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle</property>

<mapping assembly="DomainModel"/>

</session-factory>

</hibernate-configuration>

 

配以一下数据库的链接字符串。配置好那个文件从此须要设置它的个性:

复制到输出目录:始终复制

美高梅开户网址 52

二)、接下去让大家建二个简易的页面,验证对数据表Person的增加和删除改查和分页查询成效。

页面很简单

美高梅开户网址 53

二) 前台首要代码:简单用多少个按钮测试一下

美高梅开户网址 54美高梅开户网址 55View Code

<div>

使用顺序:请先Create创建一条记录,再Read阅读第一条记录,然后Updat更新第一条记录,然后Read阅读对比之前的记录,然后再删除。<br />

<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Create" />

<br />

<asp:Button ID="ButtonDelete" runat="server" Text="Delete"

onclick="ButtonDelete_Click" />

删除第一条记录<br />

<asp:Button ID="ButtonRead" runat="server" Text="Read"

onclick="ButtonRead_Click" />

阅读第一条记录<br />

<asp:Button ID="ButtonUpdate" runat="server" Text="Update"

onclick="ButtonUpdate_Click" />

更新第一条记录<br />

<asp:TextBox ID="TextBoxReadList" runat="server"></asp:TextBox>

<asp:Button ID="ButtonReadList" runat="server" Text="ReadList"

onclick="ButtonReadList_Click" />

请输入查询第几页数据<br />

</div>

 

二) 后台代码主要代码

美高梅开户网址 56美高梅开户网址 57View Code

using DomainModel.Entities;

using DAL;

namespace WebApp

{

public partial class WebForm1 : System.Web.UI.Page

{

private PersonHQL pHQL;

protected void Page_Load(object sender, EventArgs e)

{

NHinbernateHelper helper = new NHinbernateHelper();

pHQL = new PersonHQL(helper.GetSession());

}

protected void Button1_Click(object sender, EventArgs e)

{

Person person = new Person

{

UserID=Convert.ToInt32(1),

BirtherDate =Convert.ToDateTime("2012-12-25"),

Height = 200,

UserName = "张三"+DateTime.Now.Second.ToString(),

Sex =Convert.ToBoolean(true)

};

pHQL.CreatePerson(person);//增加记录

}

protected void ButtonRead_Click(object sender, EventArgs e)

{

Person person = pHQL.Read(1);//阅读第一条记录

Response.Write(person.UserID.ToString()+"<br>"+person.UserName.ToString

()+"<br>"+person.BirtherDate.ToShortDateString()+"<br>"+person.Height.ToString());

}

protected void ButtonDelete_Click(object sender, EventArgs e)

{

Person person = new Person

{

ID=1,

UserID=1,

BirtherDate = Convert.ToDateTime("2012-12-25"),

Height = 200,

UserName = "张三",

};

pHQL.DeletePerson(person);

}

protected void ButtonUpdate_Click(object sender, EventArgs e)

{

Person person = new Person

{

ID=1,

UserID = 1,

BirtherDate = Convert.ToDateTime("2012-12-25"),

Height = 198,

UserName = "李四",

Sex = false

};

pHQL.UpdatePerson(person);

}

protected void ButtonReadList_Click(object sender, EventArgs e)

{

IList<Person> persons = pHQL.GetList(Convert.ToInt32(TextBoxReadList.Text.ToString()));

foreach (Person person in persons)

{

Response.Write(person.UserName.ToString() + "<br>");

}

}

}

}

 

好了,终于成功了,让咱们来运作看一下

1)运转效果:

美高梅开户网址 58

二)Create之后,数据扩大了多少啦

美高梅开户网址 59

三)Read第二条记下

美高梅开户网址 60

3)ReadList之后

美高梅开户网址 61

发表评论

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

网站地图xml地图