亚州城ca88手机版_亚洲城官方网站|www.yzc889.com

热门关键词: 亚州城ca88手机版,亚洲城官方网站,www.yzc889.com

【转发】ADO.NET与OOdysseyM的可比(二):NHibernate完结

2019-06-08 03:08栏目:亚洲城官方网站
TAG:

 C#—Nhibernate探索

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

ADO.NET与OKugaM的相比较:NHibernate达成CRUD 转自周公

【转发】ADO.NET与O宝马X3M的相比(2):NHibernate达成CRUD  转自周公

本篇文章,让大家1块来研究Nhibernate。

从学习NhibernateERP中,还搜查捕获不单只ADO.NET能是完毕对数据库表张开操作,还会有Nhibernate、Linq、EntityFramwork这个本事。算作者管窥之见吧。

表达:个人感到在Java领域大型开采都离不了O讴歌RDXM的人影,所谓的SSH正是Spring Struts Hibernate,除了在上学基础知识的时候被告知能够行使JDBC操作数据库之外,多量的书本中都以描述使用Hibernate这么些O中华VM工具来操作数据。在.NET中操作数据库的诀要有多样,除了最直白的措施就是行使ADO.NET之外,仍是能够行使NHibernate这几个Hibernate在.NET中的落成O途锐M,要是你对第二方的O奥迪Q7M持质疑态度,你还是能使用来源微软的兑现、根正苗红的Linq可能EntityFramework。
大部从中期就起来使用.NET开辟的程序猿也许对ADO.NET有种迷恋,使用ADO.NET能够丰盛将大家最初的SQL知识发挥得不亦乐乎,并且鉴于对质量的设想,有个别人对.NET中的O安德拉M还维持1种观察态度,包涵自己要好也是这种态度。可是固然在骨子里付出中不用,并不表示大家不能够去询问和比较这么些技能,任何事物的产出和未有总有其缘由的,大家得以精晓它们的长处和优点。所以作者抽出了多少个周末的光阴独家用ADO.NET、NHibernate、Linq和EntityFramework来实现对数据库单表数据的创导、读取、更新和删除操作,也正是所谓的CRUD(C:Create/Rubicon:Read/U:Update/D:Delete)。
经过兑现平等效能的相比,我们温馨看清那种办法更契合自身。需求证实的是,如若在VS二零零六中使用EntityFramework就须要设置VS2008SP一。
在本篇周公将讲述怎么样使用NHibernate完结CRUD作用,为了便于相比较,在本次中选择与上次毫无二致的数据库和表,并且也兑现均等的效果。NHibernate是二个OPRADOM框架,所谓O昂CoraM正是Object Relational Mapping,是1种将关系型数据库中的数据与面向对象语言中目的创设映射关联的手艺,大家能够想操作对象同样操作数据,NHibernate将我们对指标的改造保存到数据库中去,并且还肩负以目的的章程从数据库中查询数据,那样就足以使开拓人士从拍卖SQL和ADO.NET上节省一些时日和活力用于拍卖事务逻辑。
1、准备
先是大家需求从英特网下载NHibernate框架,那几个能够到它的官网www.nhibernate.org上去下载,在周公写那篇小说的时候从互连网能下载到的新型版本为二.一.二.GA。如若下载的是压缩包,请将削减包解压,将会看出伍分文书夹,它们的名号和效益分别如下:
Configuration_Templates:存放NHibernate连接数据库的安顿文件的演示,在那个文件夹下分别有连接Firebird、SQL Server、MySQL、Oracle、PostgreSQL和SQLite数据库的布署示范,能够依附实际所运用的数据库选取示例中的代码并改动内部的数据源就能够。
Required_Bins:存放NHibernate运转进程中所必要的类库文件,其中还包含了第壹方的开源日志框架Log4Net,在不明确毕竟会使用那个类库的口径下提出将那几个文件夹下全部的dll文件拷贝到项目标bin文件夹下。
Required_For_LazyLoading:存放延时加载本性补助所需的框架文件,在那一个文件夹下提供了两种达成,选取1种将其下具备的dll文件拷贝到项目所在的bin文件夹下。在本示例中采纳了Castle。
Tests:存放测试用文件,在此文件夹下还应该有一个名称为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的引用,如下图所示:
亚州城ca88手机版 1
3、编写代码
三.壹创设NHibernate配置文件 NHibernate的布置文件有相对相比较一定的格式,这么些能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目增加3个名称叫hibernate.cfg.xml的xml文件,在周公的机械上那个文件的格式内容如下:

证实:个人认为在Java领域大型开拓都离不了O安德拉M的身影,所谓的SSH便是Spring Struts Hibernate,除了在就学基础知识的时候被报告能够行使JDBC操作数据库之外,大量的书本中都是描述使用Hibernate那几个OKugaM工具来操作数据。在.NET中操作数据库的点子有种种,除了最直白的主意便是运用ADO.NET之外,还是能够运用NHibernate这几个Hibernate在.NET中的落成O昂CoraM,即便你对第三方的OKugaM持嫌疑态度,你仍是能够使用来源微软的兑现、根正苗红的Linq大概EntityFramework。
抢先百分之五十从开始的一段时代就起来使用.NET开辟的技士恐怕对ADO.NET有种迷恋,使用ADO.NET能够尽量将大家开始的1段时期的SQL知识发挥得淋漓尽致,并且鉴于对质量的设想,某些人对.NET中的O福睿斯M还维持1种观看态度,包含自身自己也是这种态度。不过纵然在骨子里支出中不用,并不意味着大家无法去打听和相比那一个技术,任何事物的面世和消失总有其缘由的,大家得以精晓它们的独到之处和亮点。所以笔者抽取了多少个礼拜2的日子独家用ADO.NET、NHibernate、Linq和EntityFramework来兑现对数据库单表数据的创造、读取、更新和删除操作,也正是所谓的CRUD(C:Create/Koleos:Read/U:Update/D:Delete)。
通过兑现均等效果的比较,大家本身看清这种格局更适合本身。须求申明的是,假若在VS贰零零玖中选择EntityFramework就须要设置VS二〇〇八SP壹。
在本篇周公将讲述怎样使用NHibernate达成CRUD效用,为了有利于相比较,在这次中使用与上次同样的数据库和表,并且也落到实处均等的效应。NHibernate是三个O陆风X8M框架,所谓OCRUISERM正是Object Relational Mapping,是1种将关系型数据库中的数据与面向对象语言中指标构造建设映射关联的手艺,我们能够想操作对象一样操作数据,NHibernate将大家对目的的改造保存到数据库中去,并且还承担以指标的法子从数据库中询问数据,这样就能够使开垦人士从拍卖SQL和ADO.NET上节省一些时光和生命力用于拍卖业务逻辑。
1、准备
先是我们要求从网络下载NHibernate框架,这么些能够到它的官方网站www.nhibernate.org上去下载,在周公写那篇小说的时候从英特网能下载到的风靡版本为二.1.2.GA。借使下载的是压缩包,请将回落包解压,将汇合到伍分文件夹,它们的名目和功能分别如下:
Configuration_Templates:存放NHibernate连接数据库的安顿文件的演示,在这几个文件夹下分别有连接Firebird、SQL Server、MySQL、Oracle、PostgreSQL和SQLite数据库的配备示范,能够依据实际所运用的数据库选用示例中的代码并改动内部的数据源就能够。
Required_Bins:存放NHibernate运行进度中所供给的类库文件,个中还包含了第2方的开源日志框架Log四Net,在不鲜明毕竟会动用那么些类库的规则下建议将这么些文件夹下全部的dll文件拷贝到项指标bin文件夹下。
Required_For_LazyLoading:存放延时加载天性协助所需的框架文件,在这几个文件夹下提供了三种实现,选择1种将其下具备的dll文件拷贝到项目所在的bin文件夹下。在本示例中选用了Castle。
Tests:存放测试用文件,在此文件夹下还或许有八个名字为ABC.hbm.xml的公文,那是二个数据表对应的配置文件的亲自去做,在那么些文件夹下的公文大家都用不着,不过在此后大家会用到.hbm.xml文件。
贰、创造项目 咱俩创造2个门类,项目连串能够依靠气象选用,因为本身从此要利用NUnit来对品种张开单元测试,所以创设的类库项目。
创建项目成功现在将如下文件拷贝到项指标bin目录下:
Antlr3.Runtime.dll
Castle.Core.dll
Castle.DynamicProxy2.dll
Iesi.Collections.dll
log4net.dll
NHibernate.ByteCode.Castle.dll
NHibernate.dll
下一场在品种中增加对这一个dll的引用,如下图所示:
亚州城ca88手机版 2 
亚州城ca88手机版,三、编写代码
三.1创办NHibernate配置文件 NHibernate的布局文件有相对相比较固化的格式,那些能够从下载到框架文件收缩包解压获得,位于Configuration_Templates文件夹下。
向当前项目增进一个名叫hibernate.cfg.xml的xml文件,在周公的机械上那一个文件的格式内容如下:

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

刚学完Nhibernate,也折腾了一天才办好,就拿出去跟我们大饱眼福一下吗。

亚州城ca88手机版 3亚州城ca88手机版 4

亚州城ca88手机版 5亚州城ca88手机版 6

该版本或者是风靡版,小编下载的4.0.四.GA。当中GA意思笔者没搞掌握。可是相应不首要。

先是大家必须理解的是,NhibernateERP是OSportageM框架,所谓O奥迪Q伍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>  

亚州城ca88手机版 7

View Code

View Code

浅析文件内容

用Nhibernate的补益是何许啊?使用Nhibernate操作数据库,大家能够像操作对象一样操作数据库,Nhibernate将我们对目的的改观保存到数据库中去,还担当以指标的点子从数据库中询问数据,好处正是能够使开拓人士从拍卖数据库这里节省时间和生机用于拍卖职业逻辑。

如果您也是运用SQL Server200伍作为数据库的话,那么须要改动connection.connection_string中的数据库连接音信为你本机的接连新闻,并且实际处境更动assembly的值为您近些日子项目编写翻译后的次序集名称。
在此间还索要留意的是内需将hibernate.cfg.xml的性质改造为复制属性改为始终复制,如下图所示:
亚州城ca88手机版 8
三.二创办映射文件
炫丽文件包括了对象/关系所急需的元数据,其中富含了所选取的持久化类和到数据库的映射。NHibernate便是通过照射文件知道怎么样加载和仓库储存持久化对象。
在品种中加进1个名字为UserInfo.hbm.xml的xml文件,这么些xml文件的剧情如下:

假若你也是选择SQL Server200伍作为数据库的话,那么必要转移connection.connection_string中的数据库连接消息为你本机的连年音讯,并且实况改换assembly的值为你日前项目编译后的程序集名称。
在此间还亟需小心的是索要将hibernate.cfg.xml的特性改造为复制属性改为始终复制,如下图所示:
亚州城ca88手机版 9 
三.2创办映射文件
炫目文件包蕴了指标/关系所急需的元数据,在那之中包罗了所利用的长久化类和到数据库的映射。NHibernate正是通过炫酷文件知道哪些加载和仓库储存长久化对象。
在品种中追加三个名称叫UserInfo.hbm.xml的xml文件,这几个xml文件的内容如下:

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

大家采用的Nhibernate框架,能够再官方网址络找到,www.nhibernate.org 恐怕csdn找咯。作者那边用的本子是贰.壹.二.GA 。

亚州城ca88手机版 10亚州城ca88手机版 11

亚州城ca88手机版 12亚州城ca88手机版 13

 亚州城ca88手机版 14

1、Nhibernate目录下的内容

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

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

亚州城ca88手机版 15

View Code

View Code

开垦Required文件夹,大家见到里边是那般的。

1、Configuration_Templates:存放Nhibernate连接数据库的安排文件的演示

在意:假若想要得到在编排hibernate.cfg.xml只怕UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的叁个优秀文件夹中,在本机下1二十三日公在C盘安装了VS二零零六,那么须要将方面提到的文本拷贝到C:/Program Files/Microsoft Visual Studio 九.0/Xml/Schemas目录下,你要求根据你的其实际情状形来拷贝。
急需转移这么些文件的属性,改为“嵌入的财富”,如下图所示:

只顾:如若想要获得在编辑hibernate.cfg.xml或然UserInfo.hbm.xml时的智能提示,能够将下载NHibernate压缩包中的nhibernate-configuration.xsd和nhibernate-mapping.xsd文件拷贝到VS的贰个出奇文件夹中,在本机下13日公在C盘安装了VS2010,那么须要将方面提到的公文拷贝到C:/Program Files/Microsoft Visual Studio 9.0/Xml/Schemas目录下,你须要依据你的骨子里情况来拷贝。
急需改换那么些文件的性能,改为“嵌入的财富”,如下图所示:
 
叁.3创设长久化类 在脚下项目中创设2个名称为UserInfo.cs的类公事,那一个类的代码如下:

亚州城ca88手机版 16

亚州城ca88手机版 17

叁.三开立持久化类 在现阶段项目中创立多个名字为UserInfo.cs的类公事,那个类的代码如下:

亚州城ca88手机版 18亚州城ca88手机版 19

这里有八个类库;能够深入分析得出,这三个类库是要被引用的。

遵照实制所用的数据库选拔示例中的代码并更改内部的数据源就能够。

亚州城ca88手机版 20亚州城ca88手机版 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应该是未有用的。测度是作者忘记删除了。

亚州城ca88手机版 22

View Code

只顾:NHibernate通过选用性质的getter和setter操作来促成指标的长久化,并且供给类无法为sealed,方法和属性必须为virtual。
三.四编辑协理类 因此地点的文件NHibernate就可以兑现关系映射了,这里编写相关的协理类代码,如下:

nhibernate-configuration.xsd和nhibernate-mapping.xsd七个文本权且不清楚要怎么用的。

里面还包涵第1方的开源日志框架Log4Net,那一个框架首要用于记录程序日志信息。()

小心:NHibernate通过运用性质的getter和setter操作来促成指标的长久化,并且供给类无法为sealed,方法和天性必须为virtual。
3.4编写制定帮忙类 经过地点的文本NHibernate就可以兑现关系映射了,这里编写相关的协助类代码,如下:

亚州城ca88手机版 23亚州城ca88手机版 24

但看到.xsd文件,第不时间反应,他们理应是用来协理开荒者,快捷变动配置文件用的。为了保证起见,我们上网查询一下。

3、Required_For_LazyLoading:存放延时加载性情补助所需的框架文件,在这一个文件夹下提供了二种完成,选用个中一种将其有着的dll文件引用到品种中去。在本实例中精选了Castle

亚州城ca88手机版 25亚州城ca88手机版 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

3.五单元测试代码

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

二、起先创立第一个程序测试和陈设

叁.5单元测试代码

亚州城ca88手机版 27亚州城ca88手机版 28

C:Program Files (x86)Microsoft Visual Studio 11.0XmlSchemas

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

亚州城ca88手机版 29亚州城ca88手机版 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。并将文件放在了这里面。

我们先创设1个名字为ERP的数据库,建表,表名: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

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

亚州城ca88手机版 31

View Code

4.点评 行使OCRUISERM的非常的大的多个好处正是十分的少依旧根本并非编写数据库记录映射到指标的代码,并且在好些个景色下也不用编写SQL代码(代替他的是HSQL)。在动用ADO.NET时代小编一时有这样的体味,因为数据库的改变只怕需求改变从展现到数据库访问层的相干代码,并且还亟需转移自个儿编辑的从数据库记录转变为指标的代码,而以往单纯须求改变映射文件和长久化类的代码就能够了,除外我们还足以应用面向对象的方法对数码实行操作,我们能够看到在NHibernateCRUD中对数据库实行CRUD的代码比一直运用ADO.NET举办CRUD操的代码要简明繁多,那正是ORubiconM的吸重力。
本来使用O奥迪Q五M也会存在有的瑕疵,终究O中华VM在底部使用的是ADO.NET,对于三个有经验的开垦人士来讲,也许直接行使ADO.NET的品质比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上缓和这些难点。然则当数据量在相对级左右时那个标题就显得相比较特出了,在有的数据量在百万级以下的场馆中,合理使用NHibernate是一向不什么样难点的。

 

把之类语句在数据库实施就好了:

4.点评 选用OPAJEROM的异常的大的一个益处正是异常少依然根本无须编写数据库记录映射到对象的代码,并且在大部气象下也不用编写SQL代码(替代它的是HSQL)。在动用ADO.NET时期小编时常有如此的回味,因为数据库的改换大概须要改造从出示到数据库访问层的相关代码,并且还亟需转移自身编辑的从数据库记录转变为目的的代码,而前几日单纯须求改动映射文件和长久化类的代码就能够了,除外大家还足以应用面向对象的格局对数码实行操作,大家可以看出在NHibernateCRUD中对数据库进行CRUD的代码比平昔运用ADO.NET举办CRUD操的代码要精简多数,这便是O奇骏M的魔力。
本来使用O奥迪Q3M也会设有部分败笔,毕竟O本田UR-VM在后面部分使用的是ADO.NET,对于3个有经验的开垦职员来讲,恐怕直接利用ADO.NET的质量比使用NHibernate的频率要高,通过NHibernate的缓存机制多少能在某种程度上化解那些题目。可是当数据量在相对级左右时这么些主题素材就突显相比优秀了,在1部分数据量在百万级以下的意况中,合理使用NHibernate是尚未什么难点的。

再然后,我上网核实了下Nhibernate的采用。

亚州城ca88手机版 32亚州城ca88手机版 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]

看起来很复杂,文章有过多,写的又很复杂,于是自身割舍考察,直接尝试运用,首先第贰步,间接引用类库。

 

版权声明:本文由亚州城ca88手机版_亚洲城官方网站|www.yzc889.com发布于亚洲城官方网站,转载请注明出处:【转发】ADO.NET与OOdysseyM的可比(二):NHibernate完结