NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库,Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化工具(因此阅读Hibernate说明文档可以增强对Nhibernate 的认识)。
NHibernate 从数据库底层来持久化你的.Net 对象到关系型数据库。NHibernate 为你处理这些,远胜于你不得不写SQL去从数据库存取对象。你的代码仅仅和对象关联,NHibernat 自动产生SQL语句,并确保对象提交到正确的表和字段中去.
Nhibernate未来将会提供一些工具帮助你自动产生schema文件(现在还是基于代码)或是通过映射文件产生类(在筹措阶段)或是更新schema(来自于一个新开发者的建议)。然而,这里我们的例子是假定一切来自于完全手写,包括设置表和.Net类的编写。我们将进行以下步骤。
1.新建一个将要持久化.Net对象的表
2.构建一个需要被持久化的.Net类
3.构建一个可以让NHibernate知道如何持久化对象属性的映射文件
4.构建一个让NHibernate知道如何连接数据库的配置文件
5.使用NHibernate的API
使用的是MS Sql Server 2000, 但也可以使用任何数据库,只要你有关于它们的基于.Net数据提供驱动程序。
一. 建表
use NHibernate
go
CREATE TABLE users (
LogonID nvarchar(20) NOT NULL default ’0’,
Name nvarchar(40) default NULL,
Password nvarchar(20) default NULL,
PRIMARY KEY (LogonID)
)
go
NHibernate通过对象属性的反射来工作,因此需要添加希望持久化的对象属性。
二. 编写对应的实体类
属性和构建函数是public类型,但这个对NHibernate不是必要的.它可以使用public, protected, internal或者甚至是用private来持久化数据。
三. 写映射文件
需要一种方式去让NHibernate知道如何从一个映射到另一个。这个任务依赖于映射文件来完成。最易于管理的办法是为每一个类写一个映射文件,如果你命名它是YourObject.hbm.xml 并且把它放在和类的同一个目录里,NHiberante将会使得事情简单起来。
下面是一个User.hbm.xml的例子:
将发现name属性的值正是我们实体 类的属性,column属性值将是我们数据库里的字段。type属性是可选的(如果你不标明,NHibernate将利用反射进行最佳的推测)。
可以猜测到这个<id>标签将是映射数据库表的主键,id标签的组成刚才看的property标签是相似的。映射属性到目标数据库的字段。
内嵌的generator 标签告诉NHibernate 如何生成主键(它将恰当的为你生成主键,不管你指定何种类型,但你必须告诉它)。可以设定为assigned,意味着对象将自己生成主键(毕竟User对象常常需要一个UserID)。
提示:如果使用Visual Studio.Net 去编译的话,将user.hbm.xml的Build Action属性设置为Embedded Resource。映射文件将成为装配件的一部分。 如果你仅仅是改变映射文件,不能使用build 而应该Rebuild项目。Visual Studio.Net 不会重新编译有改变的映射文件。
四. 为数据库产生一个配置文件
还没有告诉NHibernate 去哪里连接数据库。最直接的办法是在应用程序的配置文件里设置一个NHibernate配置节。这和在Hibernate里使用属性文件是等价的。如下配置:
上面用了SqlClient 驱动,在本地连接名称为NHibernate 的数据库,提供用户名和密码。
五. 开始应用NHibernate
所有工作已经完成。你将有以下内容
User.cs ----你需要持久化的C#类
User.hbm.xml ----你的NHibernate映射文件
App.config ---对ADO.NET连接的配置信息
你的数据库里有一张User表
现简化的版本如下
创建一个Configuration对象
让Configuration知道你将存储何种类型的对象
为你选择的数据库创建一个Session对象
Load,Save和Query你的对象
通过Session的Flush()方法将对象提交给数据库。
为了更清晰,来看一些代码。
首先,创建一个Configuration对象
Configuration对象能够解析所有.Net对象和后台数据库中的映射关系。
Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate.Examples");
Configuration对象会搜索装配件里的任何以hbm.xml 结尾的文件。还有其他方法加载映射文件,但这种方式是最简单的。
下一步,创建一个Session对象
ISession对象提供一个到后台数据库的连接,ITransaction对象提供一个可以被NHibernate管理的事务。
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
接着来Load, Save和Query对象
现在可以用使用传统的.Net方法来操纵对象。
正如所看到的,关于NHiberante重要的事情是如此简单。继续并且查询数据库,验证一下User表里的新记录。
现在重要的事情就是去操心业务对象并在进行处理的时候告诉NHibernate就可以了。
当有一个UserID的时候如何获取对象(如:登陆的时候)。仅仅一句话就可以打开Session,传入key就可以了
所要做的就是通过NHibernate来进行需要的改变,并调用Session的Flush()方法提交。验证一下数据库,查查用户ID为”joe_cool”的记录中”LastLogin”的更改。
还有更好的,你可以以System.Collections.IList的方式来获取从表中的对象。如下
已经完成创建对象,持久化并通过条件查询或键值查询来返回它。