C#—Nhibernate探索

从零早先在.net中选拔Nhibernate对数据库举办操作详细步骤

ADO.NET与O帕杰罗M的可比:NHibernate完毕CRUD 转自周公

【转发】ADO.NET与O奇骏M的可比(二):NHibernate完结CRUD 
转自周公

本篇小说,让我们1道来研究Nhibernate。

从学习NhibernateELANDP中,还查出不单只ADO.NET能是促成对数据库表展开操作,还有Nhibernate、Linq、EntityFramwork那个技巧。算本人管中窥豹吧。

注脚:个人感觉在Java领域大型开发都离不了O本田UR-VM的身材,所谓的SSH就是Spring+Struts+Hibernate,除了在学习基础知识的时候被报告能够利用JDBC操作数据库之外,多量的书籍中都以描述使用Hibernate那一个OEscortM工具来操作数据。在.NET中操作数据库的方法有四种,除了最直白的法子正是运用ADO.NET之外,还能动用NHibernate这些Hibernate在.NET中的实现OWranglerM,如若您对第一方的OCR-VM持狐疑态度,你还能使用来源微软的完毕、根正苗红的Linq也许EntityFramework。
大部分从最初就从头使用.NET开发的程序员大概对ADO.NET有种迷恋,使用ADO.NET能够尽量将大家最初的SQL知识发挥得痛快淋漓,并且由于对品质的设想,某个人对.NET中的OEnclaveM还维持1种观察态度,包涵自个儿要好也是那种姿态。可是即使在事实上开发中不用,并不表示大家不可能去询问和比较这几个技术,任何事物的产出和消失总有其缘由的,大家能够精晓它们的长处和亮点。所以笔者抽出了多少个星期伍的日子独家用ADO.NET、NHibernate、Linq和EntityFramework来落到实处对数据库单表数据的创始、读取、更新和删除操作,也便是所谓的CRUD(C:Create/Wrangler:Read/U:Update/D:Delete)。
透过完成平等效果的可比,大家温馨看清那种办法更契合自个儿。须要注明的是,假如在VS200九中选取EntityFramework就要求设置VS2010SP1。
在本篇周公将讲述怎样运用NHibernate完毕CRUD功效,为了便于比较,在此番中选择与上次壹样的数据库和表,并且也达成平等的效益。NHibernate是一个ORAV四M框架,所谓O福睿斯M正是Object
Relational
Mapping,是1种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技艺,大家得以想操作对象壹样操作数据,NHibernate将大家对指标的变更保存到数据库中去,并且还担当以目的的方式从数据库中查询数据,那样就足以使开发人士从拍卖SQL和ADO.NET上节省壹些光阴和生命力用于拍卖工作逻辑。
1、准备
先是大家必要从网上下载NHibernate框架,这些能够到它的官方网址www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的新星版本为贰.一.贰.GA。借使下载的是压缩包,请将回落包解压,将会晤到5分文书夹,它们的称呼和效应分别如下:
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:存放测试用文件,在此文件夹下还有一个名称为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的引用,如下图所示:
金沙注册送58 1
3、编写代码
3.1开立NHibernate配置文件 NHibernate的布局文件有相对相比原则性的格式,那么些能够从下载到框架文件裁减包解压获得,位于Configuration_Templates文件夹下。
向当前项目增进二个名称为hibernate.cfg.xml的xml文件,在周公的机械上那一个文件的格式内容如下:

证实:个人感觉在Java领域大型开发都离不了OSportageM的人影,所谓的SSH就是Spring+Struts+Hibernate,除了在求学基础知识的时候被告知能够采纳JDBC操作数据库之外,大量的书本中都是讲述使用Hibernate这么些O索罗德M工具来操作数据。在.NET中操作数据库的办法有种种,除了最直接的点子便是利用ADO.NET之外,还足以选择NHibernate这些Hibernate在.NET中的达成OXC90M,假设你对第一方的O凯雷德M持可疑态度,你还足以应用来源微软的兑现、根正苗红的Linq也许EntityFramework。
超越一半从初期就初步使用.NET开发的程序员可能对ADO.NET有种迷恋,使用ADO.NET能够丰硕将大家早期的SQL知识发挥得不可开交,并且鉴于对品质的惦念,有个别人对.NET中的OLANDM还保持一种观看态度,包罗自家本身也是这种态势。可是便是在其实开发中不用,并不代表我们不可能去了然和比较这么些技能,任何事物的面世和消失总有其原因的,我们得以掌握它们的长处和优点。所以本身抽出了多少个星期②的时光独家用ADO.NET、NHibernate、Linq和EntityFramework来落到实处对数据库单表数据的成立、读取、更新和删除操作,也正是所谓的CRUD(C:Create/昂科雷:Read/U:Update/D:Delete)。
由此落到实处平等成效的比较,大家温馨看清那种方式更契合自身。须求验证的是,即便在VS二〇〇9中采纳EntityFramework就必要设置VS二〇〇9SP壹。
在本篇周公将讲述怎样行使NHibernate落成CRUD成效,为了便利相比,在本次中运用与上次壹致的数据库和表,并且也兑现均等的法力。NHibernate是三个OENCOREM框架,所谓OPRADOM便是Object
Relational
Mapping,是一种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技术,大家能够想操作对象1样操作数据,NHibernate将大家对指标的更动保存到数据库中去,并且还负责以指标的法子从数据库中询问数据,那样就能够使开发人士从拍卖SQL和ADO.NET上节省一些时光和活力用于拍卖业务逻辑。
1、准备
第二我们须要从网上下载NHibernate框架,这些能够到它的官方网址www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的流行版本为贰.一.2.GA。即使下载的是压缩包,请将减少包解压,将相会到6分文件夹,它们的名目和坚守分别如下:
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:存放测试用文件,在此文件夹下还有3个名字为ABC.hbm.xml的公文,那是2个数据表对应的配备文件的示范,在那个文件夹下的文书大家都用不着,可是在今后我们会用到.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的引用,如下图所示:
金沙注册送58 2 
3、编写代码
三.1创建NHibernate配置文件 NHibernate的配备文件有相对相比较固化的格式,那么些能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目增加三个名称为hibernate.cfg.xml的xml文件,在周公的机器上那么些文件的格式内容如下:

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

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

金沙注册送58 3金沙注册送58 4

金沙注册送58 5金沙注册送58 6

该版本只怕是风靡版,作者下载的肆.0.四.GA。个中GA意思作者没搞领会。可是相应不主要。

首先我们务必掌握的是,NhibernateEKoleosP是OLacrosseM框架,所谓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>  

金沙注册送58 7

View Code

View Code

浅析文件内容

用Nhibernate的好处是怎么着啊?使用Nhibernate操作数据库,大家得以像操作对象1样操作数据库,Nhibernate将大家对目的的变更保存到数据库中去,还背负以目的的办法从数据库中查询数据,好处就是能够使开发人士从拍卖数据库那里节省时间和生机用于拍卖工作逻辑。

假如您也是选取SQL
Server200伍作为数据库的话,那么须要改变connection.connection_string中的数据库连接消息为你本机的连接信息,并且实际情状更改assembly的值为您眼下项目编写翻译后的次序集名称。
在此地还须求留意的是亟需将hibernate.cfg.xml的属性更改为复制属性改为始终复制,如下图所示:
金沙注册送58 8
3.2成立映射文件
炫耀文件包蕴了对象/关系所急需的元数据,个中蕴藏了所利用的持久化类和到数据库的照射。NHibernate就是通过照射文件知道怎么着加载和仓库储存持久化对象。
在品种中追加二个名字为UserInfo.hbm.xml的xml文件,这么些xml文件的始末如下:

借使你也是利用SQL
Server二零零五作为数据库的话,那么须求改变connection.connection_string中的数据库连接音信为你本机的接连音讯,并且实况更改assembly的值为你近来项目编写翻译后的顺序集名称。
在此处还需求注意的是内需将hibernate.cfg.xml的性质更改为复制属性改为始终复制,如下图所示:
金沙注册送58 9 
三.贰创立映射文件
炫耀文件包涵了指标/关系所急需的元数据,在那之中含有了所选拔的持久化类和到数据库的映照。NHibernate正是通过炫耀文件知道怎么加载和仓库储存持久化对象。
在项目中追加一个名称叫UserInfo.hbm.xml的xml文件,那些xml文件的始末如下:

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

大家利用的Nhibernate框架,能够再官网上找到,www.nhibernate.org
大概csdn找咯。我那边用的版本是二.一.二.GA 。

金沙注册送58 10金沙注册送58 11

金沙注册送58 12金沙注册送58 13

 金沙注册送58 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,是必须文件。

金沙注册送58 15

View Code

View Code

打开Required文件夹,我们看看里面是那样的。

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

只顾:假设想要获得在编辑hibernate.cfg.xml恐怕UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的2个特殊文件夹中,在本机下31日公在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目录下,你须要依照你的其真实意况况来拷贝。
内需转移这些文件的性质,改为“嵌入的财富”,如下图所示:
 
三.3创制持久化类 在最近项目中成立一个名字为UserInfo.cs的类公事,这些类的代码如下:

金沙注册送58 16

金沙注册送58 17

叁.三开立持久化类 在此时此刻项目中开创二个名称为UserInfo.cs的类公事,那些类的代码如下:

金沙注册送58 18金沙注册送58 19

那里有四个类库;可以分析得出,那三个类库是要被引述的。

金沙注册送58 ,依照实制所用的数据库选拔示例中的代码并改变内部的数据源即可。

金沙注册送58 20金沙注册送58 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应该是未曾用的。估计是小编忘记删除了。

金沙注册送58 22

View Code

留神:NHibernate通过行使品质的getter和setter操作来促成目的的持久化,并且须求类不可能为sealed,方法和性质必须为virtual。
三.四编纂扶助类 因此地方的公文NHibernate就足以实现关系映射了,那里编写相关的支持类代码,如下:

nhibernate-configuration.xsd和nhibernate-mapping.xsd五个公文权且不明了要干什么用的。

内部还隐含第二方的开源日志框架Log四Net,这一个框架首要用于记录程序日志新闻。()

注意:NHibernate通过使用质量的getter和setter操作来促成目的的持久化,并且必要类不能够为sealed,方法和性质必须为virtual。
三.四编写制定帮忙类 由此地点的公文NHibernate就足以达成关系映射了,那里编写相关的帮忙类代码,如下:

金沙注册送58 23金沙注册送58 24

但看到.xsd文件,第权且间反应,他们应当是用来补助开发者,火速变动配置文件用的。为了保证起见,大家上网查询一下。

3、Required_For_LazyLoading:存放延时加载特性援救所需的框架文件,在那个文件夹下提供了三种实现,选择中间1种将其具有的dll文件引用到花色中去。在本实例中挑选了Castle

金沙注册送58 25金沙注册送58 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

三.五单元测试代码

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

二、早先创立第二个程序测试和布署

三.5单元测试代码

金沙注册送58 27金沙注册送58 28

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

1、 首先在数据库成立大家的表,表结构如下:

金沙注册送58 29金沙注册送58 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
1一.0。并将文件放在了那里面。

大家先创制2个名字为ETucsonP的数据库,建表,表名: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

固然感到,这俩文件好像不是这么用的,但鉴于能够判定它们并不影响程序运营,所以,先且不管他们,等程序运营起来后,再删除他们尝试。

金沙注册送58 31

View Code

4.点评 选用O讴歌RDXM的非常的大的3个便宜正是很少恐怕根本无须编写数据库记录映射到指标的代码,并且在抢先八分之四处境下也不用编写SQL代码(取而代之的是HSQL)。在接纳ADO.NET时期作者时时有如此的回味,因为数据库的改动恐怕必要转移从出示到数据库访问层的连带代码,并且还须求改变自身编辑的从数据库记录转换为目的的代码,而未来仅仅须求更改映射文件和持久化类的代码就足以了,除此而外我们还足以应用面向对象的诀要对数码举办操作,大家能够看出在NHibernateCRUD中对数据库举行CRUD的代码比一贯使用ADO.NET进行CRUD操的代码要简明许多,那便是OHummerH贰M的吸引力。
自然使用O汉兰达M也会存在有的弱点,究竟O福睿斯M在底层使用的是ADO.NET,对于三个有经验的开发人士来说,也许直接使用ADO.NET的质量比使用NHibernate的作用要高,通过NHibernate的缓存机制多少能在某种程度上缓解这几个难点。然而当数据量在相对级左右时这几个题材就显得相比杰出了,在1部分数据量在百万级以下的情状中,合理施用NHibernate是尚未什么样难题的。

 

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

4.点评 利用OKoleosM的十分的大的二个好处便是很少仍然根本不用编写数据库记录映射到对象的代码,并且在大多数情形下也不用编写SQL代码(取而代之的是HSQL)。在动用ADO.NET时期笔者不时有那样的体会,因为数据库的改变可能需求改变从出示到数据库访问层的有关代码,并且还索要转移本人编排的从数据库记录转换为对象的代码,而现行反革命独自需求更改映射文件和持久化类的代码就能够了,除此而外大家还足以行使面向对象的主意对数据开始展览操作,大家可以看来在NHibernateCRUD中对数据库实行CRUD的代码比一直利用ADO.NET实行CRUD操的代码要从简许多,这就是O兰德陆风X8M的魅力。
自然使用O奥迪Q5M也会设有部分缺陷,究竟OLX570M在尾部使用的是ADO.NET,对于1个有经验的开发职员来说,可能直接选取ADO.NET的质量比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上解决这些标题。然则当数据量在相对级左右时这一个难题就展示比较杰出了,在部分数据量在百万级以下的情景中,合理利用NHibernate是未曾什么难点的。

再之后,小编上网查证了下Nhibernate的行使。

金沙注册送58 32金沙注册送58 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伊比rnateE奥迪Q5P

1、建立了叁个类库程序,引用Iesi.Collections.dll和NHibernate.dll四个DLL。 

金沙注册送58 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映射文件如下。

金沙注册送58 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,属性的首字母要大写

再然后,作者索要树立数据库连接的类。

金沙注册送58 36金沙注册送58 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持久化对象的增加和删除改查的不贰法门。

金沙注册送58 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,是或不是足以健康运维。

金沙注册送58 39金沙注册送58 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文件夹下有如下文件。

金沙注册送58 41

 金沙注册送58 42

在做到地点的操作之后把该类型生成以下。

本身想见,那里正是数据库连接字符串的模板。

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

由于本身使用的数据库是sqlserver,所以,笔者复制了mssql.cfg.xml。

金沙注册送58 43

下一场将复制的文件,黏贴到测试的控制台程序下,然后改名叫《hibernate.cfg.xml》。

重大是:DomainModel(上一个种类变更的dll文件),Iesi.Collections,Nhibernate,nunit.framework

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

在此处大家添加三个NhibernateHelper.cs类,这些类首借使扶持下边PersonHQ.cs,获取Isession.代码如下:

【PS:作者始终没搞懂,XML中的CFG代表如何意思。】

金沙注册送58 44金沙注册送58 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”/>是后加的,原来的文章件里未有。

金沙注册送58 46金沙注册送58 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文件

 结语

金沙注册送58 48

那是一场Nhibernate探索之旅,结果是不行顺遂的计划成功了。共耗费时间2钟头。

重中之重总结以上圈着的文本,在Nhibernate包里能找到。DAL和DomainMode是上多个类型转移的dll文件。

为什么就是探索之旅呢,因为,作者也是第二遍配置Nhibernate,小编常常越多的是选取Entity
Framework。

一) 在这边我们需求配备3个文本

文中使用了部分测算,估量的词语。那是因为,真的是在推测的。笔者并不明了那么些点的法则和含义,因为作者没看Nhibernate的原代码。

金沙注册送58 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(“文件名”);//钦命文件名

若果你还没接触过OKoleosM,这当然就会慢一点。

ISessionFactory factory = cfg.buiddSessionfactory();

 

ISession session = factory.openSession();


在hibernate.cfg.xml文件中,我们需求小心的是:

注:此小说为原创,欢迎转发,请在篇章页面显明地点给出此文链接!
若你认为那篇文章还不易,请点击下右下角的推荐,10分感激!

金沙注册送58 50金沙注册送58 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>

 

配以一下数据库的链接字符串。配置好那个文件之后要求安装它的性质:

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

金沙注册送58 52

二)、接下去让大家建四个总结的页面,验证对数码表Person的增加和删除改查和分页查询作用。

页面很简单

金沙注册送58 53

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

金沙注册送58 54金沙注册送58 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) 后台代码主要代码

金沙注册送58 56金沙注册送58 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 58

2)Create之后,数据扩充了数码啦

金沙注册送58 59

三)Read第三条记下

金沙注册送58 60

3)ReadList之后

金沙注册送58 61

相关文章

网站地图xml地图