概述:
本文演示了在单个对象需要持久化的过程,这是一个简单的演示,甚至不能用在任何项目中,但确实展示了NHibernate的威力。
整个过程创建了一个类库,并用NUnit进行单元测试。通过测试用例展现在真实的表现层或业务逻辑层的使用。
我的开发环境参考:(一) NHibernate 介绍 及 安装
项目代码: SimpleClassDemo.rar
过程
1 启动Visual Studio 2005 :创建一个类库项目,项目名称为SimpleClassDemo
2 将默认的Class.cs 修改为 Cat.cs
3 在项目中引用NUnit.Framework.dll 和NHibernate.dll , 如下图

4 在项目中添加一个应用程序配置文件app.config,并编写以下内容
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
</configSections>

<nhibernate>
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2000Dialect"/>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
<add key="hibernate.connection.connection_string" value="Server=localhost;initial catalog=nhibernate;Integrated Security=SSPI"/>
</nhibernate>

</configuration>
其中:数据库连接字符串根据需要改一下
5 编写Cat类,添加属性,得到以下代码
using System;
using System.Collections.Generic;
using System.Text;

namespace SimpleClassDemo


{
public class Cat

{
private string id;
private string name;
private char sex;
private float weight;

public Cat()

{
}

public virtual string Id

{
get

{
return id;
}
set

{
id = value;
}
}

public virtual string Name

{
get

{
return name;
}
set

{
name = value;
}
}

public virtual char Sex

{
get

{
return sex;
}
set

{
sex = value;
}
}

public virtual float Weight

{
get

{
return weight;
}
set

{
weight = value;
}
}

}
}
编写的业务类必须符合以下规范:
1 拥有一个没有参数的构造函数
2 所有的属性必须有virtual修饰符,否则无法利用NHibernate进行持久化。
3 ID字段作为一个数据库的主键使用,不要有任何实际含义
6 设定ORM 映射文件,添加一个xml文件,命名为Cat.hbm.xml,内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" >
<class name="SimpleClassDemo.Cat, SimpleClassDemo" table="Cat">
<id name="Id">
<column name="CatId" sql-type="char(32)" not-null="true"/>
<generator class="identity" />
</id>
<property name="Name">
<column name="Name" length="16" not-null="true" />
</property>
<property name="Sex" />
<property name="Weight" />
</class>
</hibernate-mapping>
7 将Cat.hbm.xml的生成操作属性修改为嵌入的资源
在“解决方案资源管理器”中选择Cat.hbm.xml
F4键切换到属性窗口
修改“生成操作”属性为嵌入的资源,结果如下图:

8 在SQL Server 中创建数据库及数据表
在SQL Servr 中创建数据库,名为NHibernate
执行以下DDL脚本以创建Cat表
CREATE TABLE [dbo].[Cat](
[CatID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](16) NULL,
[Sex] [nchar](1) NULL,
[Weight] [real] NULL
) ON [PRIMARY]
9 创建单元测试,模拟表现层或商层中对对象的持久化操作
在项目中添加类:名称为Cat_Test.cs
先完成框架,代码如下:
using System;
//不使用泛型
//using System.Collections.Generic;
//替换泛型的命名空间
using System.Collections;
using System.Text;
//for NUnit UnitTest
using NUnit.Framework;
//for NHibernate Class
using NHibernate;
using NHibernate.Cfg;

using NHibernate.Expression;

namespace SimpleClassDemo


{
//01. Set the class as Unitt
[TestFixture]
public class Cat_Test

{
private Configuration cfg;
private ISessionFactory factory;
private ISession session;
private ITransaction transaction;


/**//// <summary>
/// 构造函数,确保NHibernate需要的对象被初始化
/// </summary>
public Cat_Test()

{
cfg = new Configuration();
cfg.AddAssembly("SimpleClassDemo");
factory = cfg.BuildSessionFactory();
session = factory.OpenSession();

}

}
}

10 在Cat_Test.cs中添加测试用例,保存对象
[Test]
[Description("新建一个对象并存储到数据库中,使用事务处理")]
public void SaveObjectWithTransaction()

{

Cat cat = new Cat();
//cat.Id = System.Guid.NewGuid().ToString();
cat.Name = "Tom ";
cat.Sex = 'M';
cat.Weight = 2.34F;

//告诉NHibernate 这个对象需要被保存到数据库(持久化)

try

{
transaction = session.BeginTransaction();
session.Save(cat);
transaction.Commit();
}
catch (Exception ex)

{
//throw (new ApplicationException(ex.ToString()));
transaction.Rollback();

}

}
利用TestDriven启动NUnitGUI

点击Run,测试用例通过

11 从数据库中获得一个对象列表
[Test]
[Description("根据一定的条件获得对象列表")]
public void GetObjectList()

{
//注意第一行和第二行都没有分号;
IList recentCats = session.CreateCriteria(typeof(Cat))
.Add(Expression.Eq("Name", "Tom"))
.List();

//对列表内的对象进行循环
foreach (Cat cat in recentCats)

{
System.Diagnostics.Debug.WriteLine(cat.Id +" Name:" +cat.Name);
}

}
12 将更新的信息重新存储到数据库
[Test]
[Description("从数据库中获得对象并更新")]
public void UpdateObject()

{
//获得一个已有对象
Cat updateCat = (Cat)session.Load(typeof(Cat), "1");
updateCat .Name = "New Name";
//更新对象在数据库中的存储
session.Flush();

}
13 删除对象在数据库中的存储
[Test]
[Description("删除在数据库中已经持久化的对象")]
public void DeleteObject()

{
//获得一个已有对象
try

{
Cat deleteObject = (Cat)session.Load(typeof(Cat), "2");
//更新对象在数据库中的存储
session.Delete(deleteObject);
}
catch

{
}

}
14 运行全部测试用例,通过

版本修订记录:2008-1-3 :第一版完成