开发环境:VS2010(C#)+NHibernate3.3.0GA+MSSQL2008+MBUnit3
一、前言
最近开始玩NHibernate,从网上下了一老外2008年录的NHibernate夏季之旅(Summer of Nhibernate)长14集的录像,一边看一边动手;录像每集大概90分钟,讲的都是很基础的东西,但无奈本人英语不好,只能慢慢看,慢慢试验,顺便把心得体会写下来。
二、数据库
1.准备好一个数据库,我在MSSQL2008中新建了一个hhibTest(名字乱写的)数据库,在其中新建一个表Customer。
USE [hhibTest]
GO
/****** Object: Table [dbo].[Customer] Script Date: 05/09/2012 20:08:37 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Customer](
[id] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nchar](50) NULL,
[LastName] [nchar](50) NULL
) ON [PRIMARY]
GO
三、工程建立
1.打开VS2010,新建一个C#的类库工程,具体结构如下。
其中DataTransfer是实体类,DataAccessLayer是数据存取类,DataAccessLayerTest是测试类。
2.开始要用NHibernate了,在DataTransfer中建立Customer类。
public class Customer
{
public virtual int CustomerId { set; get; }
public virtual string FirstName { set; get; }
public virtual string LastName { set; get; }
}
上面我用了VS的新特性:自动属性,程序看起来简洁多了,嘿嘿。
注意:使用NHibernate的话对象类的属性要为Virtual。
3.在DataTransfer类中新建Customer.hbm.xml文件。
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="DataTransfer">
<class name="DataTransfer.Customer,DataTransfer" table="customer">
<id name="CustomerId" column="id" type="Int32" unsaved-value="0">
<generator class="native"></generator>
</id>
<property name="FirstName" column="FirstName" type="string" length="50" not-null="false" />
<property name="LastName" column="LastName" type="string" length="50" not-null="false" />
</class>
</hibernate-mapping>
NHibernate就是通过这个文件将实体类与数据库中的标对应起来,到此为止DataTransfer类就完成了,Build一下,0 error,0 warning!
4.在DataTransfer类中引用NHibernate.dll文件,当然还要引用刚刚生成的DataTransfer.dll。
在VS中使用NHibernate3要用到这几个dll文件,可以把这几个文件放到一个文件夹里放着。
5.在DataAccessLayer中添加NhibernateDataProvider类,此类用于读取数据库。
public class NhibernateDataProvider
{
public Customer GetCustomerById(int customerId)
{
NHibernate.Cfg.Configuration config = new NHibernate.Cfg.Configuration();
config.Configure("hibernate.cfg.xml");
NHibernate.ISessionFactory sessionFactory = config.BuildSessionFactory();
NHibernate.ISession session = sessionFactory.OpenSession();
return session.Get<Customer>(customerId);
}
}
6.好了,这个类也完成了,生成一下。
四、测试
1.使用MBUnit进行测试,在DataAccessLayerTest中导入Gallio.dll及MBUnit.dll文件。
2.导入DataAccessLayer.dll及DataTransfer.dll和NHibernate.dll。
3.新建一个测试类。
[TestFixture]
public class Tests
{
[Test]
public void CanGetCustomerById()
{
DataAccessLayer.NhibernateDataProvider provider = new DataAccessLayer.NhibernateDataProvider();
Assert.AreEqual(1,provider.GetCustomerById(1).CustomerId);
}
}
4.新建一个hibernate.cfg.xml文件,此文件是NHibernate核心配置文件。
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Test">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
Server=(local);initial catalog=hhibTest;Integrated Security=True
</property>
<property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
<mapping assembly="DataTransfer" />
</session-factory>
</hibernate-configuration>
5.OK,都弄完了,Build一下。
6.使用Gallio Icarus进行测试!