前言
(注:这一章基本上全是废话,大家可跳过不看)
Nhibernate 是最近比较流行的一个源自于Java Hibernate的ORM工具,网上也有许多高水平的关于Nhibernate的文章,但是对于初学者来说,还是比较希望看到一些带有人门性质的初学者文章。我曾在自己的Blog(http://www.cnblogs.com/9527)上也发表了一些关于Nhibernate的文章,也得到了许多朋友的支持与来信,希望我能继续这一系列的文章。
由于前两年由于个人的原因,一直没有时间在继续自己的文章。辜负了大家的期望。在这里先向一些支持我的朋友道个歉。
文章主要面向对象是广大的初学者,所以我还是坚持自己简单为主、实例为上的风格,一方面自己水平有限写不出高深的文章,另一方面对于初学者来说,在了解一个新事物前,实例是最好的老师,看了许许多多的资料但是还是不知道怎么搭建最初始的环境,不知道怎么开始第一行代码哪是比较郁闷的:)。还有所有的文章都是我一边调试一边写的,所以可能过程中有许多错误,还请大家谅解,希望大家能一起解决问题,共同进步。
开发环境
开发工具我用的是SharpDevelop 2.0不是我喜欢,只因为我用的哪个笔记本跑不动VS.Net。大家用条件的话,还是建议大家用VS.Net来调试和运行代码,SharpDevelop 2.0虽然灵巧好用,但是就在我写第一个例子的时候,由于其功能的原因,我找不到具体错误的所在,我竟然用了整整两天的空余时间,汗自己一个。
数据库用的是SQLite一个轻量级的数据库,这个我也是刚接触,也就是打算在研究NHibernate的时候顺带学习一下它。
为了避免一些因为使用不同版本类库组件而带来的代码不能运行,异常出错等所以我在这里公布一下我所用的版本号
NHibernate.dll 1.0.0.0
System.Data.SQLite.dll 1.0.35.0
SQLite 0.21.1869.3794
.Net framework v2.0.50727
这些个东西sf.net都用下载,大家很容易可以下载到。
好了废话说的够多了,让我们开始吧
实例一、让我们把Nhibernate运行起来
新建数据库(这里推荐一大家一个很好用的用来管理SQLite数据库的工具SQLite Developer你可以从http://www.sharpplus.com/免费下载它。不然的话你会被SQLite Console下建立和修改数据库的过程给烦死。)
数据库的DDL
CREATE TABLE 't_user'(
[uid] INTEGER PRIMARY KEY NOT NULL
,[name] varchar(100) NOT NULL
)
编写Domain Object文件和NHibernate映射文件。
这两种文件可以用许多代码生成工具来生成,但是初学的时候还是希望大家不要怕麻烦,自己动手写一下,特别是映射文件,加深一下各个参数的作用,但是自己写的话也要异常小心,因为NHibernate对大小写敏感,还有就是在一在设置一些字段对应的时候一定要确保数据类型一致,这些错误就是因为小,在调试的时候有时还能找出来。
在工程中添加一个TUser.cs代码如下
using System;
namespace QuickStart
{
[Serializable]
public class TUser
{
private Int64 id;
private String name;
public TUser()
{
}
public Int64 Id
{
get
{ return id; }
set
{ id=value; }
}
public String Name
{
get
{ return name; }
set
{name=value;}
}
}
}
映射文件TUser.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="QuickStart.TUser, QuickStart" table="t_user">
<id name="Id" column="uid" type="Int64">
<generator class="identity" />
</id>
<property name="Name" type="String(100)" column="name" />
</class>
</hibernate-mapping>
好了这个工程中现在只需要这两个文件,工程树如下:
需要注意的地方,TUser.cs中没有特别需要注意的地方仔细一点就可以了,TUser.hbm.xml中需要注意的地方注要有:
<generator class="identity" />
这里是用来生成数据库表的主键字段的自动生成方式,Nhibernate提供了数种默认的方式(具体参见Nhibernate的文档,这里就不重复了)要提醒的是,有些方式只能支持特定的数据库,所以在选择的时候要注意。
TUser.hbm.xml在编译的时候一定要把编译方式选成“嵌入式资源”。
再次提醒特别要注意各个属性和字段一定要注意大小写,数据类型一定要一致,特别是手写代码。不是我啰嗦,实在是这样的错误太难找了。
完成了基础代码,接下来就再新建一个QuickStart.Console项目添加到工程里面。
(注:为什么不用NUnit,SharpDeveloper 2.0本身就集成了NUnit,但是不知道是BUG还是其它原因,我的测试文件,在单步调试可以顺利通过,但是在Run Test的时候,就是报错,出错的原因似乎是读取不到QuickStart.Test.Config,但是我明明就是有这个文件在bin下面,所以只能委曲求全建立一个Console项目来测试了)
首先要添加Nhibernate和QuickStart的引用。添另一个App.config文件作为程序的配置文件,这样的话在编译完后可以自动在bin目录下生成QuickStart.Console.config文件。Nhibernate的配置信息全部可以放在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>
<system.data>
<DbProviderFactories>
<remove invariant="System.Data.SQLite"/>
<add name="SQLite Data Provider" invariant="System.Data.SQLite"
description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
</DbProviderFactories>
</system.data>
<nhibernate>
<add key="hibernate.show_sql" value="true"/>
<add key="hibernate.dialect" value="NHibernate.Dialect.SQLiteDialect"/>
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SQLiteDriver"/>
<add key="hibernate.connection.connection_string" value="Data Source=C:\book\Test\Nhibernate\QuickStart.db3;Version=3"/>
<add key="hibernate.query.substitutions" value="true=1;false=0"/>
</nhibernate>
</configuration>
由于我们使用的是SQLite数据库,系统中没有默认的驱动程序,所以在安装了System.Data.SQLite后要在配置文件中也要加上相应的配置。
下面一节是NHibernate的配置,由于NHibernate文档中有比较详细的介绍,所以我这里只是更据项目的情况做一个简单的介绍。
hibernate.show_sql :这个配置参数的主要做用要在程序运行中把NHibernate生成的SQL语句显示在控制台里,当然一般情况下只有控制台应用程序才能看见。所以我们在平常调试过程中应该把它设置为true,方便调试。
Hibernate.dialect:NHibernate方言(Dialect)的类名 - 可以让NHibernate使用某些特定的数据库平台的特性,我们这里使用的是SQLite数据库,所以要它的value设置成“NHibernate.Dialect.SQLiteDialect”,
Hibernate_connection_driver_class:指定数据库链接驱动类的,NHibernate已经为SQLite创建好了驱动类,我们只要在配置文件中为SQLite配置好驱动程序能让NHibernate.DriverSQLiteDriver正确的访问到驱动程序。
hibernate.connection.connection_string:这个就是指定数据库链接字符串。
写完了配置文件,现在我们可以开发构建第一段代码,来体验一下Nhibernate的强大功能了,我们在IDE中新建一个SessionFactory.cs的文件,用来做一些初始化Session,具体代码如下
using System;
using System.Reflection;
using System.Data;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Tool.hbm2ddl;
namespace QuickStart.Tests
{
public class SessionFactory
{
private static ISessionFactory sessions;
private static Configuration cfg;
private static Dialect dialect;
public SessionFactory(){}
public static ISession OpenSession()
{
if(sessions==null)
{
BuildSessionFactory();
}
return sessions.OpenSession();
}
private static void BuildSessionFactory()
{
ExportSchema(new string[]{"TUser.hbm.xml"},false);
}
private static void ExportSchema(string[] files,bool exportschema)
{
cfg=new Configuration();
for(int i=0;i<files.Length;i++)
{
cfg.AddResource("QuickStart."+files[i],Assembly.Load("QuickStart"));//加载hbm文件
}
dialect=Dialect.GetDialect();
if(exportschema) new SchemaExport(cfg).Create(true,true);//如果数据结构不存在,则更据hbm文件创建
sessions=cfg.BuildSessionFactory();
}
}
}
这个类的主要作用更据我们的配置文件返回一个实例化的Session。Session是Nhibernate持久化的基础,是贯穿NHibernate持久化的管理核心,提供了Save、Update、Delete、Find等持久化方法。通过这些方法,我们就可以完成对对象的增加、修改、删除、查找。
然后我们打开Main.cs添加如下代码。
using System;
using System.Collections.Generic;
using NHibernate;
using QuickStart;
namespace QuickStart.Console
{
class MainClass
{
public static void Main(string[] args)
{
ISession session=null;
ITransaction t=null;
try
{
session=SessionFactory.OpenSession();//得到Session的实例
t=session.BeginTransaction();//事务开始
TUser tuser=new TUser();//
tuser.Name="Pingbo";
session.Save(tuser);
session.Flush();
t.Commit();
}
catch(HibernateException e)
{
System.Console.Write(e.Message.ToString());
if(t!=null)
{
try
{
t.Rollback();
}
catch(HibernateException e1)
{
System.Console.Write(e1.Message.ToString());
}
}
}
finally
{
session.Close();
}
System.Console.ReadLine();
}
}
}
总算是大功告成了,如果不出意外的话应该可以编译通过了。我们运行一下QuickStart.Console,在运行结束以后应该可以看到有一条记录已经被插入到数据库中
由于我们在配置文件在把Hibernate.Show_Sql设为了True所以在运行的时候我们可以在控制台看到NHibernate产生的SQL语句。
好了,第一个实例运行成功了,可以说我们迈出坚实的第一步,虽然整个程序十分简单,但它毕竟是一个完整的使用NHibernate程序,万事开头难,通过这个实例我们对NHibernate由陌生走向了熟悉,我在学习的过程中,花时间最多的就是如何成功运行第一段代码,只要这里成功了,下面就没有太多莫明其妙的问题,可以专心研究NHibernate的各个功能。好了先祝大家好运,能一次性成功运行代码。如果不能一次性搞定也不是没有好处,在排错过程中可以加深对NHibernate的理解。