net中央银行使Nhibernate对数据库进行操作详细步骤

By admin in 4858.com on 2019年3月26日

 C#—Nhibernate探索

从零开头在.net中应用Nhibernate对数据库实行操作详细步骤

ADO.NET与OENCOREM的比较:NHibernate完毕CRUD 转自周公

【转载】ADO.NET与O奔驰M级M的可比(2):NHibernate实现CRUD 
转自周公

本篇文章,让我们一起来探究Nhibernate。

从上学NhibernateELANDP中,还获悉不单只ADO.NET能是兑现对数据库表展开操作,还有Nhibernate、Linq、EntityFramwork那一个技能。算自个儿眼光浅短吧。

申明:个人感觉在Java领域大型开发都离不了O普拉多M的身形,所谓的SSH正是Spring+Struts+Hibernate,除了在读书基础知识的时候被告知能够利用JDBC操作数据库之外,多量的书籍中都以描述使用Hibernate那几个O福睿斯M工具来操作数据。在.NET中操作数据库的点子有两种,除了最直白的主意正是接纳ADO.NET之外,还能动用NHibernate那个Hibernate在.NET中的完毕OKoleosM,如果您对第2方的O猎豹CS6M持狐疑态度,你仍可以使用来源微软的兑现、根正苗红的Linq或然EntityFramework。
多数从初期就从头使用.NET开发的程序员恐怕对ADO.NET有种迷恋,使用ADO.NET能够丰裕将大家早期的SQL知识发挥得不可开交,并且鉴于对质量的设想,有个别人对.NET中的O驭胜M还保持一种阅览态度,包涵自家自身也是那种态势。然而尽管在实际上支出中不用,并不意味着大家无法去驾驭和相比这个技能,任何事物的产出和没有总有其缘由的,大家得以领会它们的优点和优点。所以自身抽出了多少个星期六的大运独家用ADO.NET、NHibernate、Linq和EntityFramework来贯彻对数据库单表数据的创导、读取、更新和删除操作,也正是所谓的CRUD(C:Create/安德拉:Read/U:Update/D:Delete)。
通过兑现平等效果的可比,我们温馨看清那种办法更切合自身。要求验证的是,假如在VS二零一零中选拔EntityFramework就必要设置VS二〇〇八SP1。
在本篇周公将讲述如何运用NHibernate实现CRUD作用,为了便利相比较,在本次中央银行使与上次一致的数据库和表,并且也落到实处平等的法力。NHibernate是一个O奥迪Q5M框架,所谓O奥迪Q3M就是Object
Relational
Mapping,是一种将关系型数据库中的数据与面向对象语言中指标建立映射关联的技能,大家得以想操作对象一样操作数据,NHibernate将大家对指标的更动保存到数据库中去,并且还背负以目的的点子从数据库中查询数据,那样就足以使开发职员从拍卖SQL和ADO.NET上节省一些时刻和精力用于拍卖事务逻辑。
1、准备
率先大家须要从网上下载NHibernate框架,这些能够到它的官方网站www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的新型版本为2.1.2.GA。若是下载的是压缩包,请将核减包解压,将会看出伍分文本夹,它们的名号和机能分别如下:
Configuration_Templates:存放NHibernate连接数据库的安顿文件的示范,在这一个文件夹下分别有连接Firebird、SQL
Server、MySQL、Oracle、PostgreSQL和SQLite数据库的配备示范,能够依照实际所选用的数据库选取示例中的代码并更改内部的数据源即可。
Required_Bins:存放NHibernate运转进度中所需求的类库文件,个中还隐含了第一方的开源日志框架Log4Net,在不鲜明毕竟会利用这些类库的规格下提议将以此文件夹下全数的dll文件拷贝到项目标bin文件夹下。
Required_For_LazyLoading:存放延时加载个性扶助所需的框架文件,在那么些文件夹下提供了三种完成,选拔一种将其下拥有的dll文件拷贝到项目所在的bin文件夹下。在本示例中精选了Castle。
Tests:存放测试用文件,在此文件夹下还有3个名为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
net中央银行使Nhibernate对数据库进行操作详细步骤。NHibernate.dll
下一场在类型中添加对这个dll的引用,如下图所示:
4858.com 1
三 、编写代码
3.1创制NHibernate配置文件 NHibernate的安顿文件有相对相比较一定的格式,那么些能够从下载到框架文件减弱包解压获得,位于Configuration_4858.com,Templates文件夹下。
向当前项目增进三个名为hibernate.cfg.xml的xml文件,在周公的机械上那些文件的格式内容如下:

表明:个人感觉在Java领域大型开发都离不了O大切诺基M的身影,所谓的SSH便是Spring+Struts+Hibernate,除了在念书基础知识的时候被告知能够运用JDBC操作数据库之外,多量的图书中都以描述使用Hibernate这些OCR-VM工具来操作数据。在.NET中操作数据库的章程有二种,除了最直白的措施就是行使ADO.NET之外,还是可以应用NHibernate这么些Hibernate在.NET中的落成O景逸SUVM,倘使您对第一方的O帕杰罗M持质疑态度,你还能选择来源微软的落实、根正苗红的Linq恐怕EntityFramework。
多数从早期就起来使用.NET开发的程序员恐怕对ADO.NET有种迷恋,使用ADO.NET能够固然将大家早期的SQL知识发挥得透彻,并且鉴于对质量的考虑,某些人对.NET中的O奥德赛M还保持一种阅览态度,包含自作者自个儿也是那种态度。不过即便在骨子里付出中不用,并不意味大家不可能去探听和相比较这个技巧,任何事物的出现和没有总有其原因的,大家得以理解它们的优长。所以本人抽出了多少个周末的岁月独家用ADO.NET、NHibernate、Linq和EntityFramework来贯彻对数据库单表数据的开创、读取、更新和删除操作,也正是所谓的CRUD(C:Create/本田UR-V:Read/U:Update/D:Delete)。
经过落到实处均等效果的比较,大家自个儿判断那种格局更切合自个儿。需要表明的是,假诺在VS二〇〇九中选择EntityFramework就供给安装VS二〇一〇SP1。
在本篇周公将讲述怎么样运用NHibernate完毕CRUD效用,为了方便相比,在这一次中动用与上次同等的数据库和表,并且也促成均等的机能。NHibernate是贰个O奥德赛M框架,所谓OPRADOM正是Object
Relational
Mapping,是一种将关系型数据库中的数据与面向对象语言中目的建立映射关联的技巧,我们能够想操作对象一样操作数据,NHibernate将大家对目的的变动保存到数据库中去,并且还担负以目的的主意从数据库中询问数据,那样就足以使开发职员从拍卖SQL和ADO.NET上节省一些日子和生机用于拍卖事情逻辑。
1、准备
首先大家要求从网上下载NHibernate框架,这几个能够到它的官方网站www.nhibernate.org上去下载,在周公写那篇小说的时候从网上能下载到的最新版本为2.1.2.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的文本,那是2个数据表对应的配置文件的示范,在这一个文件夹下的文件大家都用不着,可是在其后大家会用到.hbm.xml文件。
② 、创立项目 笔者们创建1个档次,项目项目能够遵照意况选拔,因为自己从此要利用NUnit来对品种进展单元测试,所以创立的类库项目。
创设项目中标之后将如下文件拷贝到项指标bin目录下:
Antlr3.Runtime.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
Iesi.Collections.dll
log4net.dll
NHibernate.ByteCode.Castle.dll
NHibernate.dll
然后在类型中添加对那个dll的引用,如下图所示:
4858.com 2 
叁 、编写代码
3.1创设NHibernate配置文件 NHibernate的配置文件有相对相比较固定的格式,那么些能够从下载到框架文件减少包解压获得,位于Configuration_Templates文件夹下。
向当前项目增加一个名为hibernate.cfg.xml的xml文件,在周公的机械上那么些文件的格式内容如下:

第①大家去摸索Nhibernate下载地址,如下链接所示。

刚学完Nhibernate,也折腾了一天才办好,就拿出来跟我们享受一下啊。

4858.com 34858.com 4

4858.com 54858.com 6

该版本也许是风靡版,作者下载的4.0.4.GA。在这之中GA意思笔者没搞驾驭。然而相应不主要。

先是我们亟须知道的是,NhibernateE途观P是OENCOREM框架,所谓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>  

4858.com 7

View Code

View Code

剖析文件内容

用Nhibernate的便宜是怎么吧?使用Nhibernate操作数据库,大家能够像操作对象一样操作数据库,Nhibernate将咱们对目的的改动保存到数据库中去,还肩负以指标的措施从数据库中询问数据,好处正是能够使开发职员从拍卖数据库那里节省时间和精力用于拍卖事情逻辑。

假若你也是使用SQL
Server二〇〇五作为数据库的话,那么供给转移connection.connection_string中的数据库连接音讯为您本机的连年消息,并且真实情形更改assembly的值为你日前项目编写翻译后的主次集名称。
在此地还亟需注意的是亟需将hibernate.cfg.xml的属性更改为复制属性改为始终复制,如下图所示:
4858.com 8
3.2创造映射文件
辉映文件包蕴了指标/关系所急需的元数据,在那之中包蕴了所使用的持久化类和到数据库的炫耀。NHibernate就是通过炫耀文件知道哪些加载和储存持久化对象。
在类型中扩张二个名为UserInfo.hbm.xml的xml文件,这么些xml文件的剧情如下:

一旦你也是选取SQL
Server2006作为数据库的话,那么需求变更connection.connection_string中的数据库连接音讯为您本机的连天消息,并且真实意况更改assembly的值为你近期项目编译后的次第集名称。
在此间还索要小心的是内需将hibernate.cfg.xml的质量更改为复制属性改为始终复制,如下图所示:
4858.com 9 
3.2创办映射文件
辉映文件包蕴了目标/关系所需求的元数据,在那之中包含了所利用的持久化类和到数据库的投射。NHibernate正是通过炫耀文件知道怎么着加载和存款和储蓄持久化对象。
在档次中加进多少个名为UserInfo.hbm.xml的xml文件,这几个xml文件的内容如下:

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

笔者们使用的Nhibernate框架,能够再官网上找到,www.nhibernate.org
或然csdn找咯。笔者这边用的本子是2.1.2.GA 。

4858.com 104858.com 11

4858.com 124858.com 13

 4858.com 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,是必须文件。

4858.com 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个格外文件夹中,在本机下七日公在C盘安装了VS二〇〇九,那么需求将下边提到的文件拷贝到C:/Program
Files/Microsoft Visual Studio
9.0/Xml/Schemas目录下,你须求依据你的实际上处境来拷贝。
需求转移这一个文件的习性,改为“嵌入的能源”,如下图所示:

注意:如若想要得到在编写hibernate.cfg.xml可能UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的三个非正规文件夹中,在本机下周公在C盘安装了VS2010,那么须要将方面提到的文书拷贝到C:/Program
Files/Microsoft Visual Studio
9.0/Xml/Schemas目录下,你供给基于你的实际情形来拷贝。
亟需改变这些文件的脾气,改为“嵌入的财富”,如下图所示:
 
3.3开立持久化类 在现阶段项目中开创二个名为UserInfo.cs的类公事,这么些类的代码如下:

4858.com 16

4858.com 17

3.3创建持久化类 在时下项目中创建三个名为UserInfo.cs的类公事,这一个类的代码如下:

4858.com 184858.com 19

那边有四个类库;能够分析得出,那八个类库是要被引用的。

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

4858.com 204858.com 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应该是绝非用的。测度是笔者忘记删除了。

4858.com 22

View Code

小心:NHibernate通过运用性质的getter和setter操作来达成指标的持久化,并且供给类不能为sealed,方法和属性必须为virtual。
3.4编写制定帮助类 透过上边包车型的士公文NHibernate就足以兑现关系映射了,那里编写相关的扶助类代码,如下:

nhibernate-configuration.xsd和nhibernate-mapping.xsd八个文件暂且不精晓要怎么用的。

内部还隐含第壹方的开源日志框架Log4Net,这一个框架首要用来记录程序日志消息。()

只顾:NHibernate通过采纳品质的getter和setter操作来完毕指标的持久化,并且须要类不可能为sealed,方法和性格必须为virtual。
3.4编纂辅助类 透过上边的文本NHibernate就足以兑现关系映射了,那里编写相关的帮忙类代码,如下:

4858.com 234858.com 24

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

3、Required_For_LazyLoading:存放延时加载本性援助所需的框架文件,在那些文件夹下提供了三种达成,采纳中间一种将其负有的dll文件引用到花色中去。在本实例中精选了Castle

4858.com 254858.com 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:存放测试试用文件,在此文件夹下有2个名为ABC.bhm.xml的文本,这几个是数据表对应配置文件的演示。

View Code

3.5单元测试代码

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

② 、开首创设第二个程序测试和布署

3.5单元测试代码

4858.com 274858.com 28

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

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

4858.com 294858.com 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。并将文件放在了那里面。

我们先创立叁个名为ERAV4P的数据库,建表,表名: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

虽说觉得,那俩文件好像不是如此用的,但由于能够判定它们并不影响程序运营,所以,先且不管他们,等程序运转起来后,再删除他们尝试。

4858.com 31

View Code

4.点评 选用O牧马人M的非常大的一个益处就是很少恐怕根本不用编写数据库记录映射到目的的代码,并且在大多数气象下也不用编写SQL代码(取而代之的是HSQL)。在选拔ADO.NET时期笔者不时有诸如此类的认知,因为数据库的改动恐怕须求变更从出示到数据库访问层的相关代码,并且还亟需转移自身编排的从数据库记录转换为指标的代码,而明天一味须求更改映射文件和持久化类的代码就能够了,除此而外大家还足以应用面向对象的章程对数码举行操作,我们能够看到在NHibernateCRUD中对数据库进行CRUD的代码比向来利用ADO.NET实行CRUD操的代码要精简许多,那正是OPRADOM的吸引力。
自然使用O兰德酷路泽M也会设有一些弱点,终究O福睿斯M在底部使用的是ADO.NET,对于三个有经验的开发人士来说,恐怕一直利用ADO.NET的品质比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上消除那个题材。可是当数据量在相对级左右时这一个难点就展现相比较卓越了,在一些数据量在百万级以下的情状中,合理运用NHibernate是尚未什么问题的。

 

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

4.点评 应用OPAJEROM的相当大的多个利益正是很少也许根本并非编写数据库记录映射到目的的代码,并且在大部情景下也不用编写SQL代码(取而代之的是HSQL)。在行使ADO.NET时期作者不时有那样的体味,因为数据库的改观或者必要变更从出示到数据库访问层的有关代码,并且还亟需转移自身编排的从数据库记录转换为指标的代码,而现行反革命可是须要更改映射文件和持久化类的代码就能够了,除此而外大家还足以选用面向对象的主意对数码举行操作,大家能够看来在NHibernateCRUD中对数据库进行CRUD的代码比间接选用ADO.NET进行CRUD操的代码要从简许多,那就是O中华VM的吸重力。
理所当然使用O哈弗M也会设有部分缺点,究竟O哈弗M在底部使用的是ADO.NET,对于三个有经验的开发职员来说,恐怕直接选拔ADO.NET的质量比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上消除那些标题。可是当数据量在相对级左右时那么些难题就展现比较杰出了,在一些数据量在百万级以下的景况中,合理利用NHibernate是绝非什么难点的。

再然后,小编上网查证了下Nhibernate的施用。

4858.com 324858.com 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步,直接引用类库。

 

 

三 、创制贰个化解方案命名为NH伊比rnateE奇骏P

① 、建立了二个类库程序,引用Iesi.Collections.dll和NHibernate.dll五个DLL。 

4858.com 34

接下去,大家开首树立持久化对象。

壹 、在缓解方案添加三个体系,分别为DAL,DomainModel,WebApp

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

1)
在类型DomainModel中分别见五个目录,Entities和Mappings从大意上大家能够清楚,

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

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

调查结果:

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

对象与数据库的投射是保留在XML文件中的,于是笔者陈设XML映射文件如下。

4858.com 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,属性的首字母要大写

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

4858.com 364858.com 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持久化对象的增加和删除改查的不二法门。

4858.com 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,是还是不是能够寻常运维。

4858.com 394858.com 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文件夹下有如下文件。

4858.com 41

 4858.com 42

在形成地点的操作之后把该品种生成以下。

自小编想见,那里正是数据库连接字符串的模版。

贰 、在DAL项目中,引用须求的dll文件,包涵以下

鉴于自家动用的数据库是sqlserver,所以,作者复制了mssql.cfg.xml。

4858.com 43

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

重在是:DomainModel(上一个项目转移的dll文件),Iesi.Collections,Nhibernate,nunit.framework

此处测试了下,貌似不改名糟糕使,配置文件内容如下

在此地大家抬高一个NhibernateHelper.cs类,这么些类重点是帮忙下边PersonHQ.cs,获取Isession.代码如下:

【PS:小编一向没搞懂,XML中的CFG代表怎么样意思。】

4858.com 444858.com 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”/>是后加的,原作件里不曾。

4858.com 464858.com 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.2那句话笔者想了很久要不要改成4.0。

姣好以上的步子,然后生成以下改项目。

结果是自笔者没改,测试一切平常。能够顺遂使用。

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

 结语

4858.com 48

那是一场Nhibernate探索之旅,结果是老南梁畅的配备成功了。共耗费时间2钟头。

第二归纳以上圈着的文本,在Nhibernate包里能找到。DAL和DomainMode是上多少个档次转移的dll文件。

为啥便是探索之旅呢,因为,笔者也是首回配置Nhibernate,笔者平日愈来愈多的是采取Entity
Framework。

1) 在此处大家须求布置贰个文件

文中使用了一部分算计,猜度的词语。那是因为,真的是在揣度的。作者并不亮堂那1个点的原理和含义,因为自个儿没看Nhibernate的原代码。

4858.com 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科雷傲M,那自然就会慢一点。

ISessionFactory factory = cfg.buiddSessionfactory();

 

ISession session = factory.openSession();


在hibernate.cfg.xml文件中,大家必要小心的是:

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

4858.com 504858.com 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>

 

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

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

4858.com 52

2)、接下去让大家建三个简便的页面,验证对数据表Person的增加和删除改查和分页查询功用。

页面很简短

4858.com 53

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

4858.com 544858.com 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) 后台代码首要代码

4858.com 564858.com 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)运转效果:

4858.com 58

2)Create之后,数据增添了数据啦

4858.com 59

3)Read第1条记下

4858.com 60

3)ReadList之后

4858.com 61

发表评论

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

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有