NHibernate是一款面向.NET环境的对象/关系数据库映射工具。提供了将域模型(类)映射到传统关系数据库并生成查询所需的框架。它的目标主要是用于与数据持久化相关的编程任务,大幅度减少开发时人工使用SQL和ADO.NET处理数据的时间。能够使开发人员从原来枯燥的SQL语句的编写中解放出来,解放出来的精力可以让开发人员投入到业务逻辑的实现上。
相关配置
一、基本配置
1、需要一个自定义的配置节点,一般放在Web.config里或App.config里面,当然你可以自己定义实际位置
(1)、声明自定义配置节点
name:自定义配置节点名称。
type:处理程序位置。
(2)、声明是哪一个数据库驱动程序。
(3)、数据库连接。
(4)、所使用的SQL方言,通过这个方言,才知道要将你写的查询语句,翻译成何种数据库的SQL语句。
(5)、设定映射文件默认所在的程序集。
2、软件的映射文件一定要设为嵌入的资源。
3、软件的实体类所有的属性都要加上virtual-虚属性,作为一个ORM框架,它需要知道如何将数据库的表与对应的实体类相关联,通过映射文件的方式来获得这方面的信息。
二、获取映射文件相关配置
软件中的映射文件以hbm.xml为后缀结束,获取映射文件的方法有3种方法:
1、从config程序配置文件获取映射文件位置
运行在.Net程序上,需要自己提供一个自定义配置节点,这个配置节点里面包含了数据库连接,什么数据库等等信息。其中就包括了配置文件所在位置的信息。
会直接从Web.config或App.config文件上的配置节点上读取这个节点,然后从节点指定的程序集去查找映射文件。
2、编程的方式,写在代码里
(1)、AddFile 指定映射文件
ISessionFactory sessionFactory = new Configuration().Configure().AddFile(@"C:UsersAdministratorDesktopNHibernate学习ModelMappingPerson.hbm.xml").BuildSessionFactory();
ps:当你不写全路径的时候,也就是只写个文件名,那么它就会从配置文件读取程序集,到配置文件中指定的程序集去加载此映射文件。如果配置文件并不指定程序集,那么就从当前程序集中查找指定名的映射文件。但这种方式,不必设置嵌入的资源,但要记得设置为始终复制。
Configuration cfg = new Configuration().AddFile("Mapping/Person.hbm.xml");ISessionFactory sessionFactory = cfg.BuildSessionFactory();
这种方法只是指定一个文件,但是可以链式指定多个如:AddFile("f1").AddFile("f2")。
(2)、AddAssembly
还有另外一种方法,在创建Configuration时指定程序集。
Configuration cfg = new Configuration().AddAssembly("Model"); //Model为映射文件所在程序集名称
ISessionFactory sessionFactory = cfg.BuildSessionFactory();
这种方法,即使.config配置文件里
节点为空也没关系,软件会自动到指定的程序集里查找所有以.hbm.xml结尾的文件。
(3)、AddClass
这种方式,可以消除程序对文件路径字符串的硬编码。
Configuration cfg = new Configuration().AddClass(typeof(Model.Person));
ISessionFactory sessionFactory = cfg.BuildSessionFactory();
但是缺点也非常明显,类名必须与映射文件的名称相同。不然,编译就无法通过,因为Person类都找不到。另外,映射文件Person.hbm.xml必须放在根目录。会自动到程序中去查找名为Person.hbm.xml文件。使用方法
步骤一、创建数据库和映射的表
步骤二、创建项目和实体类映射类以及类对应的映射文件
新建一个网站,网站创建之后,网站解决方案右键,选择添加 => 新建项目 => 类库
给类库起名
与之前写的实体类不同的是此实体类每个属性前面就加了virtual,虚方法或者属性的关键字,子类可以从新定义(override),在这里必须有virtual 关键字,不然程序运行就会出错。笔者判断此原因可能是程序在运行时候此属性被重新映射(定义),所以必须添加virtual关键字。
然后比较重要的一个步骤就是配置此实体类对应的映射文件,此映射xml文件名称固定为“实体类.hbm.xml”
实体类的属性配置,其中“Com.uuu9.nHibernate”为上述所建类库(生成程序集的名称)的名称。注意:每个实体类对应的映射文件“实体类.hbm.xml”,都要右键设置生成类型属性为:嵌入的资源
因为当作为一个资源被嵌入后,项目的默认命名空间与文件名就组成了资源访问的完整名称,软件运行时会访问资源的完整名称,但如果不设置,程序就找不到映射文件,就会认为此类没有设置映射,也就不能使用操作。
步骤三、添加项目引用与NHibernate(版本2.1.2)的dll文件
步骤四、配置hibernate.cfg.xml文件(数据库映射信息配置)
hibernate.cfg.xml文件为NHibernate的配置文件,名称固定,且必须放到Bin目录中
name可以自己随意定义:NHibernate.Dialect.MsSql2005Dialect
“NHibernate.Dialect.MsSql2005Dialect”可根据实际的数据库的需要改为 2000Dialect、2008Dialect。
注意:“”为实体类生成程序集的名称,一直要写正确,一定要有。
步骤五、创建和使用NHibernate
至此NHibernate制作完毕。体系结构
1、SessionFactory(NHibernate.IsessionFactory):它是Session的工厂,是ConnectionProvider的客户。可以持有一个可选的(第二级)数据缓存,可以在进程级别或集群级别保存的可以在事物中重用的数据。
2、会话(NHibernate.ISession):单线程,生命期较短的对象,代表应用程序和持久化层之间的一次对话。封装了一个ADO.NET连接,也是Transaction的工厂。保存有必需的(第一级)持久化对象的缓存,用于遍历对象图,或者通过标识符查找对象。
3、持久化对象(Persistent)及其集合(Collections):生命期较短的单线程的对象,包含了持久化状态和商业功能。这些可能是普通的对象,唯一特别的是现在从属于且仅从属于一个Session。一旦Session被关闭,它们都将从Session中取消联系,可以在任何程序层自由使用(比如,直接作为传送到表现层的DTO,数据传输对象)。
4、临时对象(Transient Object)及其集合(Collection):目前没有从属于一个Session的持久化类的实例。这些可能是刚刚被程序实例化,还没有来得及被持久化,或者是被一个已经关闭的Session实例化。
5、事务Transaction (NHibernate.ITransaction):(可选)单线程,生命期较短的对象,应用程序用其来表示一批工作的原子操作,它是底层的ADO.NET事务的抽象。一个Session在某些情况下可能跨越多个Transaction事务。
6、ConnectionProvider(NHibernate.Connection.ConnectionProvider):(可选)ADO.NET连接的工厂。从底层的IDbConnection抽象而来。对应用程序不可见,但可以被开发者扩展/实现。
7、TransactionFactory(net.sf.hibernate.TransactionFactory):(可选)事务实例的工厂。对应用程序不可见,但可以被开发者扩展/实现。常见问题
处理字段NULL值的问题
因为 birthday 在数据库里是“smalldatetime”类型,所以我们在创建表实体、以及xml映射的时候,可能会把 birthday 的类型设置为“DateTime”。但是经过这样的设置后,可能会出现以下错误提示:
SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Data.SqlTypes.SqlTypeException: SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM 之间。
解决方法:
当库中的字段为 DateTime 类型的时候,我们在创建表实体、以及xml映射的时候,应该将类型设置为“String”。
0条评论