威尼斯人线上娱乐

net中运用Nhibernate对数据库实行操作详细步骤

10 4月 , 2019  

 C#—Nhibernate探索

从零伊始在.net中使用Nhibernate对数据库举行操作详细步骤

ADO.NET与OQX56M的可比:NHibernate达成CRUD 转自周公

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

本篇文章,让大家1道来商讨Nhibernate。

从学习NhibernateE奥迪Q5P中,还搜查缉获不单只ADO.NET能是达成对数据库表展开操作,还有Nhibernate、Linq、EntityFramwork这一个技巧。算自个儿管中窥豹吧。

注明:个人感觉在Java领域大型开发都离不了O宝马X3M的身材,所谓的SSH就是Spring+Struts+Hibernate,除了在上学基础知识的时候被报告能够利用JDBC操作数据库之外,大批量的书本中都以描述使用Hibernate这些O福睿斯M工具来操作数据。在.NET中操作数据库的不贰秘诀有各个,除了最直白的方式就是使用ADO.NET之外,还是能动用NHibernate这几个Hibernate在.NET中的达成O奥迪Q伍M,假若您对第一方的O奥迪Q3M持思疑态度,你还是可以使用来源微软的兑现、根正苗红的Linq也许EntityFramework。
大部从初期就开头使用.NET开发的程序员恐怕对ADO.NET有种迷恋,使用ADO.NET能够足够将大家早期的SQL知识发挥得不亦乐乎,并且鉴于对品质的思虑,有个别人对.NET中的OHighlanderM还保持壹种阅览态度,包蕴自家本身也是那种态势。不过固然在其实支付中不用,并不意味着大家不能够去精通和相比这几个技巧,任何事物的面世和消逝总有其缘由的,我们得以理解它们的亮点和长处。所以自己抽出了多少个礼拜五的日子独家用ADO.NET、NHibernate、Linq和EntityFramework来兑现对数据库单表数据的成立、读取、更新和删除操作,也正是所谓的CRUD(C:Create/奥迪Q三:Read/U:Update/D:Delete)。
通过落实平等效果的可比,大家温馨看清那种办法更适合本身。要求验证的是,假诺在VS200玖中利用EntityFramework就要求安装VS二〇〇八SP1。
在本篇周公将讲述怎样运用NHibernate完结CRUD成效,为了便于比较,在本次中动用与上次一模壹样的数据库和表,并且也达成平等的效劳。NHibernate是1个OLX570M框架,所谓OEnclaveM正是Object
Relational
Mapping,是1种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技艺,大家得以想操作对象壹样操作数据,NHibernate将大家对目的的改动保存到数据库中去,并且还背负以指标的方法从数据库中查询数据,这样就能够使开发人士从拍卖SQL和ADO.NET上节省1些时刻和生命力用于拍卖工作逻辑。
1、准备
先是大家须求从网上下载NHibernate框架,那一个能够到它的官方网站www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的新星版本为二.一.二.GA。倘使下载的是压缩包,请将核减包解压,将会看到4分文本夹,它们的名号和功力分别如下:
Configuration_Templates:存放NHibernate连接数据库的安顿文件的演示,在这么些文件夹下分别有连接Firebird、SQL
Server、MySQL、Oracle、PostgreSQL和SQLite数据库的配备示范,能够依照实际所选拔的数据库选取示例中的代码并改变内部的数据源即可。
Required_Bins:存放NHibernate运转进度中所需求的类库文件,当中还蕴藏了第一方的开源日志框架Log四Net,在不鲜明终究会动用那多少个类库的规范下提出将以此文件夹下全部的dll文件拷贝到项指标bin文件夹下。
Required_For_LazyLoading:存放延时加载性子匡助所需的框架文件,在那一个文件夹下提供了三种达成,选取1种将其下有所的dll文件拷贝到项目所在的bin文件夹下。在本示例中选取了Castle。
Tests:存放测试用文件,在此文件夹下还有1个名称为ABC.hbm.xml的文本,那是八个数据表对应的布局文件的演示,在那个文件夹下的文件大家都用不着,但是在后头大家会用到.hbm.xml文件。
二、创立项目 小编们创立3个档次,项目项目能够遵照事态选拔,因为自己后来要动用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文件夹下。
向当前项目增加3个名字为hibernate.cfg.xml的xml文件,在周公的机械上那么些文件的格式内容如下:

证实:个人感觉在Java领域大型开发都离不了OKoleosM的人影,所谓的SSH正是Spring+Struts+Hibernate,除了在学习基础知识的时候被报告能够应用JDBC操作数据库之外,大批量的图书中都以讲述使用Hibernate这一个OPRADOM工具来操作数据。在.NET中操作数据库的措施有各类,除了最直接的措施正是行使ADO.NET之外,还足以行使NHibernate那个Hibernate在.NET中的达成O揽胜极光M,假诺你对第一方的O大切诺基M持狐疑态度,你还足以选择来源微软的完结、根正苗红的Linq或许EntityFramework。
超过53%从初期就从头使用.NET开发的程序员恐怕对ADO.NET有种迷恋,使用ADO.NET能够尽量将大家早期的SQL知识发挥得不亦乐乎,并且鉴于对品质的怀想,有些人对.NET中的O翼虎M还保持1种观察态度,包罗自家自身也是那种姿态。但是尽管在实际上付出中不用,并不意味着大家不能够去明白和相比较那么些技能,任何事物的产出和未有总有其缘由的,大家得以理解它们的长处和优点。所以笔者抽出了多少个星期天的时刻独家用ADO.NET、NHibernate、Linq和EntityFramework来落实对数据库单表数据的创立、读取、更新和删除操作,相当于所谓的CRUD(C:Create/景逸SUV:Read/U:Update/D:Delete)。
经过落到实处均等效果的相比,大家自身看清那种方式更合乎本身。供给表明的是,若是在VS二零一零中使用EntityFramework就须要设置VS二零一零SP壹。
在本篇周公将讲述怎么样选用NHibernate实现CRUD功效,为了便于相比较,在此次中采纳与上次一模一样的数据库和表,并且也达成平等的作用。NHibernate是1个O昂CoraM框架,所谓O奥迪Q3M正是Object
Relational
Mapping,是1种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技艺,大家得以想操作对象一样操作数据,NHibernate将我们对目的的改动保存到数据库中去,并且还担当以目的的方式从数据库中查询数据,这样就足以使开发人士从拍卖SQL和ADO.NET上节省1些时刻和生命力用于拍卖工作逻辑。
1、准备
率先我们须求从网上下载NHibernate框架,那一个能够到它的官方网址www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的新型版本为2.一.二.GA。假如下载的是压缩包,请将滑坡包解压,将会合到六分文件夹,它们的名称和功能分别如下:
Configuration_Templates:存放NHibernate连接数据库的安插文件的示范,在那个文件夹下分别有连接Firebird、SQL
Server、MySQL、Oracle、PostgreSQL和SQLite数据库的布署示范,能够依照实际所运用的数据库选取示例中的代码并转移内部的数据源即可。
Required_Bins:存放NHibernate运维进程中所须要的类库文件,个中还蕴藏了第一方的开源日志框架Log四Net,在不明确到底会利用那个类库的准绳下建议将这几个文件夹下全部的dll文件拷贝到项指标bin文件夹下。
Required_For_LazyLoading:存放延时加载性格扶助所需的框架文件,在这么些文件夹下提供了二种实现,选用1种将其下全数的dll文件拷贝到项目所在的bin文件夹下。在本示例中甄选了Castle。
Tests:存放测试用文件,在此文件夹下还有2个名称叫ABC.hbm.xml的文件,那是1个数据表对应的铺排文件的以身作则,在那些文件夹下的文本大家都用不着,但是在事后大家会用到.hbm.xml文件。
二、创立项目 我们创设一个体系,项目项目能够依照气象采取,因为笔者后来要采纳NUnit来对品种展开单元测试,所以创制的类库项目。
创设项目成功之后将如下文件拷贝到项指标bin目录下:
Antlr3.Runtime.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
net中运用Nhibernate对数据库实行操作详细步骤。Iesi.Collections.dll
log4net.dll
NHibernate.ByteCode.Castle.dll
NHibernate.dll
下一场在品种中添加对那一个dll的引用,如下图所示:
威尼斯人线上娱乐 2 
3、编写代码
3.一创设NHibernate配置文件 NHibernate的布署文件有绝比较较固化的格式,这些可以从下载到框架文件减少包解压获得,位于Configuration_Templates文件夹下。
向当前项目增进四个名字为hibernate.cfg.xml的xml文件,在周公的机械上那个文件的格式内容如下:

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

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

威尼斯人线上娱乐 3威尼斯人线上娱乐 4

威尼斯人线上娱乐 5威尼斯人线上娱乐 6

该版本只怕是风靡版,作者下载的四.0.四.GA。在这之中GA意思笔者没搞驾驭。可是相应不重大。

第1大家不能够不精通的是,NhibernateEXC90P是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操作数据库,我们能够像操作对象1样操作数据库,Nhibernate将大家对目的的更改保存到数据库中去,还承担以指标的点子从数据库中询问数据,好处便是能够使开发职员从拍卖数据库那里节省时间和精力用于拍卖事务逻辑。

如果你也是使用SQL
Server200五作为数据库的话,那么须求改变connection.connection_string中的数据库连接新闻为你本机的连年音讯,并且真实意况更改assembly的值为你日前项目编译后的顺序集名称。
在此间还必要注意的是内需将hibernate.cfg.xml的品质更改为复制属性改为始终复制,如下图所示:
威尼斯人线上娱乐 8
3.二创办映射文件
炫耀文件包蕴了对象/关系所要求的元数据,个中饱含了所选取的持久化类和到数据库的照耀。NHibernate就是通过照射文件知道什么样加载和存款和储蓄持久化对象。
在品种中加进一个名称叫UserInfo.hbm.xml的xml文件,那么些xml文件的内容如下:

万壹你也是使用SQL
Server二零零六作为数据库的话,那么要求变更connection.connection_string中的数据库连接消息为您本机的连年音信,并且实情更改assembly的值为你眼下项目编写翻译后的次第集名称。
在那边还索要注意的是亟需将hibernate.cfg.xml的本性更改为复制属性改为始终复制,如下图所示:
威尼斯人线上娱乐 9 
3.二创造映射文件
辉映文件包括了指标/关系所供给的元数据,在那之中蕴蓄了所使用的持久化类和到数据库的投射。NHibernate正是通过照射文件知道什么样加载和储存持久化对象。
在项目中扩充3个名叫UserInfo.hbm.xml的xml文件,那么些xml文件的剧情如下:

下载实现后,解压缩,大家看来文件夹内容如下图所示。

大家应用的Nhibernate框架,能够再官网上找到,www.nhibernate.org
只怕csdn找咯。作者那里用的版本是二.一.二.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的3个奇异文件夹中,在本机上周公在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的一个卓越文件夹中,在本机下一周公在C盘安装了VS二〇〇九,那么必要将地点提到的文书拷贝到C:/Program
Files/Microsoft Visual Studio
9.0/Xml/Schemas目录下,你须求依照你的骨子里情况来拷贝。
亟需转移这一个文件的天性,改为“嵌入的财富”,如下图所示:
 
3.三创设持久化类 在近年来项目中开创贰个名字为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。
三.四编辑帮助类 通过上边的文书NHibernate就足以兑现关系映射了,那里编写相关的援救类代码,如下:

nhibernate-configuration.xsd和nhibernate-mapping.xsd八个文本一时不知底要干什么用的。

里面还隐含第二方的开源日志框架Log4Net,这几个框架首要用于记录程序日志消息。()

在意:NHibernate通过利用性质的getter和setter操作来落到实处指标的持久化,并且须要类不可能为sealed,方法和总体性必须为virtual。
3.4编辑扶助类 经过地方的文书NHibernate就能够完成关系映射了,那里编写相关的帮忙类代码,如下:

威尼斯人线上娱乐 23威尼斯人线上娱乐 24

但看到.xsd文件,第一时半刻间反应,他们应该是用来提携开发者,快速变化配置文件用的。为了保障起见,大家上网查询一下。

3、Required_For_LazyLoading:存放延时加载本性帮衬所需的框架文件,在那一个文件夹下提供了二种完成,选拔中间1种将其颇具的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

询问结果是,他们俩是【文件智能提示意义】用的。

4、Tests:存放测试试用文件,在此文件夹下有一个名字为ABC.bhm.xml的公文,这几个是数据表对应配置文件的示范。

View Code

3.5单元测试代码

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

贰、初始成立第2个程序测试和配备

三.伍单元测试代码

威尼斯人线上娱乐 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中华VP的数据库,建表,表名: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.点评 选拔ORubiconM的十分的大的一个功利正是很少可能根本无须编写数据库记录映射到指标的代码,并且在大多数气象下也不用编写SQL代码(取而代之的是HSQL)。在选择ADO.NET时期作者经常有诸如此类的咀嚼,因为数据库的变更只怕要求变更从出示到数据库访问层的相关代码,并且还亟需改变自身编辑的从数据库记录转换为目的的代码,而后天只有须要更改映射文件和持久化类的代码就足以了,除此而外我们仍是能够动用面向对象的法子对数码开始展览操作,大家能够看看在NHibernateCRUD中对数据库实行CRUD的代码比直接运用ADO.NET进行CRUD操的代码要精简许多,那正是O瑞鹰M的魔力。
本来使用O揽胜M也会设有有的瑕疵,究竟OHavalM在底部使用的是ADO.NET,对于三个有经历的开发人士来说,只怕一向运用ADO.NET的性能比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上缓解那一个难点。可是当数据量在绝对级左右时那一个题材就显得相比较杰出了,在有个别数据量在百万级以下的动静中,合理选择NHibernate是从未怎么难题的。

 

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

4.点评 采用O路虎极光M的相当大的一个利益正是很少只怕根本不用编写数据库记录映射到指标的代码,并且在大多数动静下也不用编写SQL代码(取而代之的是HSQL)。在选取ADO.NET时代作者时常有这么的回味,因为数据库的改动恐怕须求改变从出示到数据库访问层的连带代码,并且还索要变更本人编写的从数据库记录转换为指标的代码,而未来仅仅供给更改映射文件和持久化类的代码就足以了,除却大家还是能够利用面向对象的法子对数码实行操作,我们能够观察在NHibernateCRUD中对数据库进行CRUD的代码比直接行使ADO.NET实行CRUD操的代码要简单许多,那正是ORubiconM的魔力。
自然使用O途乐M也会存在壹些弱点,终归O安德拉M在底层使用的是ADO.NET,对于一个有经验的开发职员来说,也许直接行使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]

看起来很复杂,文章有无数,写的又很复杂,于是自身屏弃调查,直接尝试利用,首先第2步,直接引用类库。

 

 

三、成立1个解决方案命名称为NH伊比rnateE奔驰G级P

1、建立了贰个类库程序,引用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文件的习性,必要安装其生成操作为【嵌入的财富】。

第3大家把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字符串连接。

3)、【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
十.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二零零六的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-2.二那句话小编想了很久要不要改成四.0。

成就上述的步调,然后生成以下改项目。

结果是本人没改,测试壹切经常。能够顺遂使用。

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

 结语

威尼斯人线上娱乐 48

那是一场Nhibernate探索之旅,结果是分外顺利的配置成功了。共耗费时间二小时。

驷不比舌回顾上述圈着的文本,在Nhibernate包里能找到。DAL和DomainMode是上五个档次转移的dll文件。

为啥就是探索之旅呢,因为,小编也是第一次配置Nhibernate,小编平日更加多的是利用Entity
Framework。

1) 在那里大家须求配置3个文件

文中使用了部分估计,猜想的辞藻。那是因为,真的是在测算的。作者并不知情这几个点的规律和含义,因为本身没看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(“文件名”);//钦命文件名

若是您还没接触过OEvoqueM,那自然就会慢一点。

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

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

威尼斯人线上娱乐 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>

 

2) 后台代码主要代码

威尼斯人线上娱乐 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第三条记下

威尼斯人线上娱乐 60

3)ReadList之后

威尼斯人线上娱乐 61


相关文章

发表评论

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

网站地图xml地图