菜鸟初探NHibernate(2.1.0.Alpha2)笔记
目录导航:
1. 前言
2. 开工
3. 业务域模型
3.1 编写业务域模型
3.2 数据库脚本
3.3 映射文件
4. hibernate.cfg.xml配置
5. 表现层设计
6. 参考文献
1.前言
小生初学.NET和NHibernate,文笔很粗糙,纯粹是做为一份学习笔记,文中有涉及到的错误望各位多多指出,谢谢。
话说在同老哥的一次对话中,不经意之间提到了ORM,怀着无比好奇的心迈进了NHibernate的神奇世界中。
小生使用的是NHibernate最新版本2.1.0.Alpha2.。还没开始动手实践之前,在网络上翻了大量的NHibernate教程, 由于版本间的差异,在配置过程中是有所不同的,造成后来一次次失败的原因。
2.开工
学习目的:创建一个简单的NHibernate应用程序,加深一下对NHibernate基础知识。
环境:Windows 2003 + VS 2005 + Sql Server2000 + NHibernate 2.1.0.Alpha2
解包后目录结构如下:
├─Configuration_Templates
├─Required_Bins
├─Required_For_LazyLoading
│ ├─Castle
│ ├─LinFu
│ └─Spring
└─Tests
先把Required_Bins目录中的nhibernate-configuration.xsd和nhibernate-mapping.xsd拷贝到%VS2005安装目录%"Xml"Schemas文件夹里。
这两个文件的作用:编辑NHibernate配置文件和映射文件的时候会产生智能提示。
新建一个空白解决方案命名为:NHibernate。
项目结构如下:

3.业务域模型
3.1 编写业务域模型
先来定义一个简单的业务域模型为:Students,其中有ID,Name两个属性。

创建相应的。NET类定义和数据库表
namespace Model
{
public class Students
{
private int _ID;
private string _Name;
public int ID
{
get { return _ID; }
set { _ID = value; }
}
public string Name
{
get { return _Name; }
set { _Name = value; }
}
}
}
3.2数据库脚本
数据库表Students脚本如下:
CREATE TABLE [dbo].[Students] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
3.3映射文件
现在开始为Students编写ORM映射文件,这一些有很多细节部分值得注意,也是造成错误的源头之一。

在Students.hbm.xml架构 - 选择文章提过的nhibernate-mapping.xsd文件。
Students.hbm.xml如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model">
<class name="Model.Students,Model" table="Students" lazy="false">
<id name="ID" column="ID" type="Int32">
<generator class="identity" />
</id>
<property name="Name" type="String" length="50" />
</class>
</hibernate-mapping>
说明:映射配置文件中的class元素的name指定业务对象全名及其所在程序集,table指定数据表的名称,column指定表的字段关系,type指定字段的数据类型,generator元素则指明主键字段唯一值的生成方法,常用的主健产生方式有自增型(identity)和赋值型(assigned)。identity表示Nhbernate使用Sql Server提供的自增加唯一值的方法,如果想给ID属性赋值来保证唯一性的话,可以为assigned。
注意:请别忘了将Students.hbm.xml的生成操作设为:嵌入的资源。
否则会产生:No persister for: Model.Students

生成一下Model项目。
4. hibernate.cfg.xml配置
接下来配置hibernate.cfg.xml文件,2.1.0和2.0的配置有所不同。
1. 2.1.0中要求加入对NHibernate.ByteCode.LinFu和NHibernate.ByteCode.Castle的引用,并在配置里加上
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
否则出错如下:

2. 使用2.1.0之前需要把.NET Framework 2.0升级至SP1.
http://www.microsoft.com/Downloads/details.aspx?familyid=79BC3B77-E02C-4AD3-AACF-A7633F706BA5&displaylang=en
否则出现:未能从程序集“mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.DateTimeOffset”。
完整的/bin/hibernate.cfg.xml如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<session-factory>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>
<!-- SQL方言,这边设定的是MsSQL2000 -->
<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>
<!-- Hibernate的连接加载类 -->
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<!—数据库连接字符串 -->
<property name="connection.connection_string">server=(local);database=Hibernate;uid=sa;pwd=123456</property>
<!—为true表示将Hibernate发送给数据库的sql显示出来 -->
<property name="show_sql">true</property>
<property name="adonet.batch_size">10</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>
<!—关键:即要映射的程序集名-->
<mapping assembly="Model"/>
</session-factory>
</hibernate-configuration>
<mapping assembly=”Model”/>没有添加的话一样会出现:
No persister for: Model.Students。
出错内容同样与2.0.1不一样。
5. 表现层设计
编写表现层,添加引用以下几个文件Model.dll、Required_Bins"NHibernate.dll、Required_For_LazyLoading"Castle"NHibernate.ByteCode.Castle.dll和Required_For_LazyLoading"LinFu"NHibernate.ByteCode.LinFu.dll。
表现层代码如下:
using System;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NHibernate;
using NHibernate.Cfg;
using Model;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Configure()会搜索配置文件里<mapping assembly="Model"/>并加载
Configuration cfg = new Configuration().Configure();
//创建session对象,ISession对象提供一个到后台数据库的连接
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
//ITransaction对象提供一个可以被NHibernate管理的事务。
ITransaction tx = session.BeginTransaction();
Students sd = new Students();
sd.Name = "陈小明";
//保存到数据库里
session.Save(sd);
//事务提交
tx.Commit();
//最后调用session的Close方法来释放NHibernate所使用的asp.net连接资源
session.Close();
}
}
浏览一下页面后打开数据库,发现数据已经被添加进来了。
代码很简短,很整洁,不再使用到SqlConnection,SqlCommand等对象为来操作数据库。
谢谢!同时希望可以结识志同道合的朋友。
6.参考文献:
http://www.cnblogs.com/chenou/articles/880259.html
[NHibernate使用简介]
http://www.cnblogs.com/chenxizhang/archive/2009/04/12/1434025.html
[Could not load type 'System.DateTimeOffset'的问题]
http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/01/your-first-nhibernate-based-application.aspx
[Your first NHibernate based application]
文章来源:博客园
文章地址:http://www.cnblogs.com/kine/articles/1459351.html
作者:kine

浙公网安备 33010602011771号