【亚洲必赢官网】从零初阶在

 C#—Nhibernate探索

从零起初在.net中采用Nhibernate对数据库实行操作详细步骤

ADO.NET与OWranglerM的可比:NHibernate实现CRUD 转自周公

【转发】ADO.NET与O卡宴M的相比较(贰):NHibernate完毕CRUD 
转自周公

本篇文章,让大家1同来探索Nhibernate。

从读书NhibernateE科雷傲P中,还获知不单只ADO.NET能是贯彻对数据库表进行操作,还有Nhibernate、Linq、EntityFramwork这一个技术。算笔者管窥蠡测吧。

证实:个人感觉在Java领域大型开发都离不了O翼虎M的人影,所谓的SSH就是Spring+Struts+Hibernate,除了在读书基础知识的时候被告知能够应用JDBC操作数据库之外,大批量的书本中都是讲述使用Hibernate这一个O冠道M工具来操作数据。在.NET中操作数据库的办法有各种,除了最直接的点子正是选取ADO.NET之外,还足以行使NHibernate这些Hibernate在.NET中的完毕O奥迪Q伍M,固然您对第1方的O路虎极光M持疑忌态度,你还足以选取来源微软的落到实处、根正苗红的Linq或许EntityFramework。
当先二分一从最初就起来使用.NET开发的程序员只怕对ADO.NET有种迷恋,使用ADO.NET能够就算将大家最初的SQL知识发挥得透彻,并且由于对品质的设想,有个别人对.NET中的O奥迪Q3M还维持一种旁观态度,包蕴自身要好也是这种态度。不过就算在实际付出中不用,并不表示大家不能够去询问和相比较那个技巧,任何事物的出现和未有总有其缘由的,大家能够领悟它们的优长。所以笔者抽出了几个周末的年华独家用ADO.NET、NHibernate、Linq和EntityFramework来贯彻对数据库单表数据的始建、读取、更新和删除操作,也正是所谓的CRUD(C:Create/普拉多:Read/U:Update/D:Delete)。
透过落到实处平等效果的可比,大家温馨看清那种办法更切合本人。须要注脚的是,借使在VS二〇〇玖中采纳EntityFramework就需求设置VS二零零六SP1。
在本篇周公将讲述怎样运用NHibernate达成CRUD功效,为了便于相比,在本次中选取与上次一律的数据库和表,并且也达成均等的意义。NHibernate是3个OPRADOM框架,所谓ORAV四M正是Object
Relational
Mapping,是一种将关系型数据库中的数据与面向对象语言中目的建立映射关联的技术,大家可以想操作对象1样操作数据,NHibernate将大家对指标的更动保存到数据库中去,并且还肩负以指标的点子从数据库中询问数据,这样就能够使开发职员从拍卖SQL和ADO.NET上节省一些时刻和活力用于拍卖业务逻辑。
1、准备
首先咱们需求从网上下载NHibernate框架,这一个能够到它的官方网址www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的摩登版本为二.一.二.GA。要是下载的是压缩包,请将削减包解压,将汇合到4分文书夹,它们的名目和效应分别如下:
Configuration_Templates:存放NHibernate连接数据库的布局文件的演示,在那几个文件夹下分别有连接Firebird、SQL
Server、MySQL、Oracle、PostgreSQL和SQLite数据库的配置示范,能够依照实际所运用的数据库选取示例中的代码并转移内部的数据源即可。
Required_Bins:存放NHibernate运转进度中所须要的类库文件,当中还富含了第二方的开源日志框架Log4Net,在不明确毕竟会采取这几个类库的口径下提出将以此文件夹下全体的dll文件拷贝到项目标bin文件夹下。
Required_For_LazyLoading:存放延时加载本性帮衬所需的框架文件,在那几个文件夹下提供了三种完成,选择一种将其下有所的dll文件拷贝到项目所在的bin文件夹下。在本示例中选用了Castle。
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
三、编写代码
3.一成立NHibernate配置文件 NHibernate的布置文件有相对相比较固化的格式,这么些能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目增加二个名字为hibernate.cfg.xml的xml文件,在周公的机械上那些文件的格式内容如下:

注脚:个人感觉在Java领域大型开发都离不了O奥迪Q7M的身材,所谓的SSH正是Spring+Struts+Hibernate,除了在就学基础知识的时候被报告能够行使JDBC操作数据库之外,大批量的书籍中都以描述使用Hibernate这一个O君越M工具来操作数据。在.NET中操作数据库的艺术有多样,除了最直白的不2法门正是应用ADO.NET之外,还足以利用NHibernate这些Hibernate在.NET中的实现O宝马7系M,假若你对第2方的O奥德赛M持质疑态度,你还足以运用来源微软的达成、根正苗红的Linq也许EntityFramework。
大部从最初就从头使用.NET开发的程序员也许对ADO.NET有种迷恋,使用ADO.NET能够尽量将我们最初的SQL知识发挥得痛快淋漓,并且由于对性能的设想,某个人对.NET中的O奥迪Q5M还维持1种观望态度,包罗本身要好也是那种姿态。然则固然在事实上支付中不用,并不表示我们不能够去询问和相比较那几个技术,任何事物的产出和消逝总有其缘由的,大家能够理解它们的亮点和亮点。所以作者抽出了多少个周二的时间独家用ADO.NET、NHibernate、Linq和EntityFramework来实现对数据库单表数据的创始、读取、更新和删除操作,也便是所谓的CRUD(C:Create/智跑:Read/U:Update/D:Delete)。
因此兑现均等效果的可比,大家本身判断那种办法更适合自身。供给证实的是,若是在VS贰零零八中利用EntityFramework就要求安装VS贰零1零SP1。
在本篇周公将讲述怎么样利用NHibernate完成CRUD作用,为了便利比较,在本次中应用与上次同样的数据库和表,并且也落实平等的功用。NHibernate是一个OLX570M框架,所谓O凯雷德M便是Object
Relational
Mapping,是1种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技艺,大家得以想操作对象一样操作数据,NHibernate将我们对目的的变更保存到数据库中去,并且还担负以目的的法子从数据库中查询数据,这样就能够使开发人士从拍卖SQL和ADO.NET上节省一些时刻和精力用于拍卖事情逻辑。
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:存放测试用文件,在此文件夹下还有2个名称叫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的引用,如下图所示:
亚洲必赢官网 2 
三、编写代码
叁.1创建NHibernate配置文件 NHibernate的布署文件有相对相比较固化的格式,那么些能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目增进1个名叫hibernate.cfg.xml的xml文件,在周公的机械上那几个文件的格式内容如下:

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

刚学完Nhibernate,也折腾了1天才办好,就拿出去跟大家分享一下呢。

亚洲必赢官网 3亚洲必赢官网 4

亚洲必赢官网 5亚洲必赢官网 6

该版本大概是新型版,小编下载的四.0.四.GA。个中GA意思小编没搞理解。可是相应不首要。

第一我们不可能不理解的是,NhibernateE卡宴P是O纳瓦拉M框架,所谓O普拉多M正是Object
Relational Mapping,是一种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技巧。

<?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
Server二零零六作为数据库的话,那么须求转移connection.connection_string中的数据库连接音讯为您本机的接连音讯,并且实情更改assembly的值为您日前项目编写翻译后的先后集名称。
在那里还索要小心的是索要将hibernate.cfg.xml的天性更改为复制属性改为始终复制,如下图所示:
亚洲必赢官网 9 
三.2创设映射文件
辉映文件包蕴了目的/关系所需求的元数据,个中蕴蓄了所使用的持久化类和到数据库的投射。NHibernate正是通过照射文件知道怎样加载和存款和储蓄持久化对象。
在类型中扩展三个名称为UserInfo.hbm.xml的xml文件,这些xml文件的剧情如下:

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

咱俩应用的Nhibernate框架,能够再官网上找到,www.nhibernate.org
也许csdn找咯。作者那里用的本子是贰.一.贰.GA 。

亚洲必赢官网 10亚洲必赢官网 11

亚洲必赢官网 12亚洲必赢官网 13

 亚洲必赢官网 14

1、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的三个新鲜文件夹中,在本机上周公在C盘安装了VS二〇〇九,那么须要将方面提到的文本拷贝到C:/Program
Files/Microsoft Visual Studio
玖.0/Xml/Schemas目录下,你要求基于你的莫过于情状来拷贝。
内需变更这一个文件的性质,改为“嵌入的财富”,如下图所示:

在意:若是想要得到在编写制定hibernate.cfg.xml恐怕UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的二个出奇文件夹中,在本机前一周公在C盘安装了VS二〇〇八,那么供给将地方提到的文本拷贝到C:/Program
Files/Microsoft Visual Studio
玖.0/Xml/Schemas目录下,你要求依据你的骨子里情状来拷贝。
亟需转移这几个文件的习性,改为“嵌入的能源”,如下图所示:
 
三.叁开立持久化类 在日前项目中开创一个名称为UserInfo.cs的类公事,那几个类的代码如下:

亚洲必赢官网 16

亚洲必赢官网 17

三.③成立持久化类 在现阶段项目中创建三个名称叫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.4编辑帮助类 透过上面的公文NHibernate就足以兑现关系映射了,那里编写相关的帮忙类代码,如下:

nhibernate-configuration.xsd和nhibernate-mapping.xsd八个文本临时不精通要干什么用的。

里头还蕴藏第三方的开源日志框架Log4Net,那一个框架主要用于记录程序日志音讯。()

留神: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情势的器皿,基于此基本容器所确立的应用程序,能够高达程序组件的涣散耦合,让程序组件能够举办测试,那一个特点都使得整个应用程序能够再框架结构上与保险上都能博取11分程度的简化。(来自百度

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

3.伍单元测试代码

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

二、初阶创设第三个程序测试和安插

三.伍单元测试代码

亚洲必赢官网 27亚洲必赢官网 28

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

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

亚洲必赢官网 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);  
        }  
    }  
}  

因为是笔者用的是vs2011,所以,笔者找的途径是Microsoft Visual Studio
1一.0。并将文件放在了那里面。

咱俩先创制3个名叫EEvoqueP的数据库,建表,表名: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的十分大的2个利益便是很少可能根本无须编写数据库记录映射到目的的代码,并且在大部分景色下也不用编写SQL代码(取而代之的是HSQL)。在选拔ADO.NET时期小编每每有这么的体味,因为数据库的变更可能供给转移从出示到数据库访问层的连带代码,并且还供给改变自身编写的从数据库记录转换为目的的代码,而以后只有须求更改映射文件和持久化类的代码就足以了,除了这一个之外大家还足以动用面向对象的不二秘诀对数码实行操作,大家能够见到在NHibernateCRUD中对数据库进行CRUD的代码比直接使用ADO.NET进行CRUD操的代码要简明许多,那正是OLacrosseM的魔力。
自然使用O揽胜M也会设有有的缺陷,终究OQX56M在底部使用的是ADO.NET,对于八个有经验的开发人士来说,可能一直使用ADO.NET的品质比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上解决这些难题。可是当数据量在相对级左右时那些题材就显示相比较优良了,在局地数据量在百万级以下的事态中,合理使用NHibernate是未曾什么样难题的。

 

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

4.点评 行使OTiguanM的非常的大的二个功利正是很少也许根本并非编写数据库记录映射到指标的代码,并且在多数场合下也不用编写SQL代码(取而代之的是HSQL)。在应用ADO.NET时期笔者时时有如此的咀嚼,因为数据库的更动大概须要转移从出示到数据库访问层的连锁代码,并且还须求改变本人编辑的从数据库记录转换为目的的代码,而方今只是需求更改映射文件和持久化类的代码就能够了,除此而外我们还足以采用面向对象的章程对数码举行操作,我们能够观察在NHibernateCRUD中对数据库举办CRUD的代码比从来动用ADO.NET实行CRUD操的代码要简单许多,那正是O瑞虎M的吸重力。
理所当然使用ORubiconM也会设有部分瑕疵,毕竟O奥德赛M在底部使用的是ADO.NET,对于1个有经历的开发人士来说,大概从来动用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、成立1个缓解方案命名称为NH伊比rnateETucsonP

一、建立了3个类库程序,引用Iesi.Collections.dll和NHibernate.dll七个DLL。 

亚洲必赢官网 34

接下去,大家起首创建持久化对象。

1、在缓解方案添加几个项目,分别为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

在达成地点的操作之后把该项面生成以下。

自个儿想来,那里就是数据库连接字符串的沙盘。

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

是因为笔者利用的数据库是sqlserver,所以,作者复制了mssql.cfg.xml。

亚洲必赢官网 43

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

珍视是:DomainModel(上叁个类型转移的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贰零零8的property
修改为

 

亚洲必赢官网,<property
name=”dialect”>NHibernate.Dialect.MsSql2012Dialect</property> 

接下来再添加1个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是读那几个布局文件,然后到这些程序集里,反射查询那3个poco对象。

 

聊到底,nhibernate-configuration-二.贰那句话笔者想了很久要不要改成4.0。

完了以上的步子,然后生成以下改项目。

结果是自小编没改,测试一切寻常。能够顺遂使用。

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

 结语

亚洲必赢官网 48

那是一场Nhibernate探索之旅,结果是相当贯虱穿杨的布署成功了。共耗费时间2钟头。

重大包蕴以上圈着的文本,在Nhibernate包里能找到。DAL和DomainMode是上几个档次转移的dll文件。

缘何正是探索之旅呢,因为,笔者也是第二遍配置Nhibernate,小编平时更加多的是接纳Entity
Framework。

壹) 在此处大家须求布署2个文本

文中使用了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为文件名

当然不必太追求速度,因为每一种人的底子不相同等。笔者相比纯熟Entity
Framework。所以读书Nhibernate就会比较快。

Configuration cfg = new Configuration().configure(“文件名”);//钦命文件名

倘诺你还没接触过O中华VM,那自然就会慢一点。

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

二)、接下去让我们建1个简单的页面,验证对数码表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>");

}

}

}

}

 

好了,终于达成了,让大家来运作看一下

一)运营作效果果:

亚洲必赢官网 58

二)Create之后,数据扩张了数量啦

亚洲必赢官网 59

3)Read第3条记下

亚洲必赢官网 60

3)ReadList之后

亚洲必赢官网 61

网站地图xml地图