NHibernate是一个面向.NET环境的对象/关系数据库映射框架,主要应用在数据持久层,和其它的ORM框架一样用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。Nhibernate 来源于非常优秀的基于Java的Hibernate 关系型持久化框架。Nhibernate支持多种类型的数据库,包括:FireBird、MSSQL、MySql、Oracle、PostgreSQL、SQLite、SybaseASE、SybaseSQLAnywhere。
准备工作:
需要使用.NET Framework 2.0或上以版本的框架,准备NHibernate框架,本文使用3.3版,到目前NHibernate都还是基于.net framework 2.0,官方下载地址:http://sourceforge.net/projects/nhibernate/files/,如果嫌麻烦,可以下载本文示例,中间包含了NHibernate。
开始做一个简单的增删改查示例,如图1示例:
图1
1、创建数据库与表,这里假设使用NibernateDemo数据库,Users表包括(id,name,pwd)字段,id是主键自动增长,name与pwd为varchar(16)。
2、新建项目并添加引用,将NHibernate-3.3.0.GA-bin中的“Iesi.Collections.dll”与“NHibernate”引用到项目中,如图2所示复制Configuration_Templates文件夹中的对应数据库配置文件,这里使用MSSQL,所以复制“MSSQL.cfg.xml”,并对NHibernate的配置信息适当修改。
图2
<?
xml version="1.0" encoding="utf-8"
?>
<
hibernate-configuration
xmlns
="urn:nhibernate-configuration-2.2"
>
<
session-factory
name
="NHibernateDemo"
>
<
property
name
="connection.driver_class"
>NHibernate.Driver.SqlClientDriver
</
property
>
<
property
name
="connection.connection_string"
>
server=.;uid=sa;pwd=sa;database=NibernateDemo;
</
property
>
<
property
name
="dialect"
>NHibernate.Dialect.MsSql2008Dialect
</
property
>
<
mapping
assembly
="NHibernateDemo.WebUI"
/>
</
session-factory
>
</
hibernate-configuration
>
其中connection.driver_class表示数据库客户端驱动类型;connection.connection_string表示连接字符串;dialect表示数据库类型,如果数据库为MSSQL2005则应修改为NHibernate.Dialect.MsSql2005Dialect;mapping表示映射NHibernateDemo.WebUI命名空间下的所有类型,包含持久化类以及对应映射文件所在的应用程序集名称。
3、编写实体类(POCO,Plain Old CLR Objects),映射文件包含POCO类映射到一个或者多个数据库表的元数据信息。User.cs文件如下所示。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace NHibernateDemo.WebUI
{
public
class User
{
public
virtual
int Id {
get;
set; }
public
virtual
string Name {
get;
set; }
public
virtual
string Pwd {
get;
set; }
}
}
NHibernate持久化类的所有的public的属性必须声明为virtual,否则映射不成功。
4、为POCO类编写写一个数据库映射文件,其实User.hbm.xml映射文件包含了对象/关系映射(ORM)所需的元数据。元数据包含持久化类的声明和属性到数据库的映射。该文件将POPO类型与数据表进行映射。User.hbm.xml内容如下所示。
<?
xml version="1.0" encoding="utf-8"
?>
<
hibernate-mapping
xmlns
="urn:nhibernate-mapping-2.2"
namespace
="NHibernateDemo.WebUI"
assembly
="NHibernateDemo.WebUI"
>
<
class
name
="NHibernateDemo.WebUI.User,NHibernateDemo.WebUI"
table
="Users"
lazy
="false"
>
<
id
name
="Id"
column
="id"
unsaved-value
="0"
>
<
generator
class
="native"
/>
</
id
>
<
property
name
="Name"
column
="name"
type
="string"
length
="16"
not-null
="true"
></
property
>
<
property
name
="Pwd"
column
="pwd"
type
="string"
length
="16"
not-null
="false"
></
property
>
</
class
>
</
hibernate-mapping
>
每个持久化类都应该有一个标识属性,该文件必须输出到Bin目录中,否则会报错“xxx is not mapped”,如图3所示具体方法是:选择User.hbm.xml文件->属性->生成操作,设置这个属性的值为“嵌入的资源”
图3
5、定义NHibernateHelper的帮助类,Isession是NHibernate的工作单元,它是一个持久化管理器,我们通过ISession来从数据库中存取数据。ISessionFactory代表一个数据库,并且使用一个XML配置文件(Web.config或者hibernate.cfg.xml)。 NHibernate通过对Configuration().Configure()的调用来装载配置文件,并初始化成一个Configuration实例,一般ISessionFactory通常只是被初始化一次,可以借助Application_start。NHibernateHelper.cs如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
using NHibernate.Cfg;
namespace NHibernateDemo.WebUI
{
///
<summary>
///
管理ISession对象的辅助类
///
</summary>
public
sealed
class NHibernateHelper
{
private
static
readonly ISessionFactory sessionFactory;
static NHibernateHelper()
{
//
获得NHibernate对当前使用的MSSQL数据库配置文件的物理路径
string configPath = HttpContext.Current.Server.MapPath(
"
~/MSSQL.cfg.xml
");
//
通过配置信息创建一个NHibernate实例
sessionFactory =
new Configuration().Configure(configPath).BuildSessionFactory();
}
//
获得当前NHibernate实例
public
static ISession GetCurrentSession()
{
ISession currentSession = sessionFactory.OpenSession();
return currentSession;
}
//
关闭NHibernate实例
public
static
void CloseSessionFactory()
{
if (sessionFactory !=
null)
{
sessionFactory.Close();
}
}
}
}
6、编写数据库访问层代码,UsersDAL.cs代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NHibernate;
namespace NHibernateDemo.WebUI
{
public
class UsersDAL
{
//
介于NHibernate与.NET应用程序中的主运行接口
ISession session =
null;
//
获得所有用户
public IList<User> GetAllUsers()
{
try
{
//
获得当前运行的NHibernate实例
session = NHibernateHelper.GetCurrentSession();
//
事务开始
ITransaction transaction = session.BeginTransaction();
//
执行HQL查询
IList<User> users = session.CreateQuery(
"
from User
").List<User>();
//
提交事务
transaction.Commit();
return users;
}
catch (Exception)
{
throw;
}
finally
{
//
关闭与ADO.NET的连接
session.Close();
}
}
//
添加
public
int Add(User user)
{
try
{
session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
session.Save(user);
transaction.Commit();
return user.Id;
}
catch (Exception)
{
throw;
}
finally
{
session.Close();
}
}
//
获得单个对象通过编号
public User GetUserById(
int id)
{
try
{
session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
User user = session.Load<User>(id);
transaction.Commit();
return user;
}
catch (Exception)
{
throw;
}
finally
{
session.Close();
}
}
//
更新
public
void Update(User user)
{
try
{
session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
session.SaveOrUpdate(user);
transaction.Commit();
}
catch (Exception)
{
throw;
}
finally
{
session.Close();
}
}
//
删除
public
void Delete(
int id)
{
try
{
User user = GetUserById(id);
session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
if (user !=
null)
{
session.Delete(user);
}
transaction.Commit();
}
catch (Exception)
{
throw;
}
finally
{
session.Close();
}
}
}
}
7、在表示层使用UserDAL中的方法。
总结:这个示例算是对Nhibernate学习的一个“Hello world”,内容中有不少是参照前辈们的文章,我只是学习和分享学习。Nhibernate的学习资源远比不上Hibernate,性能不如ADO.NET,但它能是.NET平台中比较优秀的一个ORM框架之一,Hibernate还有很长的路要走。学习笔记而以,请大家海涵。
示例下载,有数据库