简单认识NHibrenate
NHibernate
NHibernate定义
NHibernate是一个面向.NET环境的对象/关系数据库映射工具。对象关系(O/R Mapping,Object Relatiional Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。
NHibernate不仅仅管理.NET类到数据库表的映射(包括.NET数据类型到SQL数据类型的映射),还提供数据查询和获取数据的方法,大幅度减少我们开发室人工使用SQL和ADO.NET处理数据的时间。NHibernate的目标是对开发者通常的数据持久化相关的编程任务,解放其中的95%。并请记住NHibernate作为数据库访问层,是与你的程序紧密集成的。
一、创建C#类库项目
1)开发环境:Microsoft Visual Studio 2008 SP1、SQL Server 2008 Express、NHibernate 2.1.1GA。
2)获取NHibernate(http://sourceforge.net/projects/nhibernate/处可以获取NHibernate的最新版本)。
3)准备数据库表(新建一个数据库:NHibernate,包括四个表:客户表、订单表、订单产品表、产品表)
4)新建项目文件夹,如下图所示。(将下载NHibernate中Castle.Core.dll、Castle.DynamicProxy2.dll、Iesi.Collections.dll、log4net.dll、NHibernate.dll、nunit.core.dll、nunit.framework.dll如图2所示程序集文件拷贝到lib文件夹下)
5)添加项目引用
l DomainModel:引用Iesi.Collections.dll程序集(Set集合在这个程序集中)和Castle动态代理
l DAL:引用NHibernate.dll和Iesi.Collections.dll程序集和动态代理相关程序集, DomainModel引用
l DAL.Test:引用NHibernate.dll和Iesi.Collections.dll程序集,nunit.framework.dll程序集(测试框架),DomainModel和DAL引用
二、设计DomainModel层
1)新建一个Customer.cs类文件(编写持久化类来映射成为数据库表)
规则:
l NHibernate使用属性的getter和setter来实现持久化。
l 属性可设置为public、internal、protected、protected internal 或private
注意:
NHibernate默认使用代理功能,要求持久化类不是sealed的,而且其公共方法、属性和时间声明为virtual。在这里,类中的字段要设置为virrual,否则出现”failed:........”异常。
2)编写映射文件
小提示:
我们要为Microsoft Visual Studio 2008添加编写NHibernate配置文件智能提示的功能。只要在下载的NHibernate里找到configuration.xsd和nhibernate-mapping.xsd两个文件并复制到C:\Program Files\Microsoft Visual Studio 9.0\Xml\Schemas目录即可。
NHibernate要知道怎样去加载和存储持久化类的对象。这正是NHibernate映射文件发挥作用的地方。映射文件包含了对象/关系映射所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。映射文件告诉NHibernate它应该访问数据库里的哪个表及使用表里面的哪些字段。
这里,我们在mapping文件夹下新建一个XML文件,命名为Customer.hbm.xml。
注意:
XML文件的默认生成操作为”内容”这里需要修改为”嵌入的资源”生成,使用.NET Reflector查看程序集
否则出现”faied:....”异常。
三、设计数据访问层
我们现在可以NHibernate了。首先,我们要从ISessionFactory中获取一个ISession(NHibernate的工作单元)。ISessionFactory可以创建并打开心的Session。一个Session代表一个单线程的单元操作。ISessionfactory是线程安全的,很多线程可以同时访问它。ISession是不线程安全的,它代表与数据库之间的一次操作。ISessionFactory通常是个线程安全的全局对象,只需要被实例化一次。我们可以使用GoF23中的单例(Singleton)模式在程序中创建ISessionFactory。
1)在DAL层新建一类NHibernateSample.cs,编写以方法GetCustomerId用于读取客户信息。在编写方法之前,我们要初始化Session。
NHibnernate有不同的方法来从数据库中取回对象。最灵活的方式是使用NHibernate查询语句(HQL)是完全基于面向对象的SQL。
四、编写数据访问层的测试
1)使用hibernate.cfg.xml文件来配置。
注意:
XML文件默认“复制到输出目录”为“不复制”,这里需要修改为“始终复制”。否则出现“failed:.......”异常。
2)测试,新建一个测试类NHibernateSampleFixture.cs来编写测试用例:调用NHibernateSample类中GetCustomerId方法查询数据库中CustomerId为1客户,判断返回客户的Id是否为1.