Nhibernate+SQLite 入门实例指南一

 

 
Nhibernate+SQLite 实例指南

前言

(注:这一章基本上全是废话,大家可跳过不看)

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的理解。

posted @ 2006-09-23 13:58 无心之柳.NET 阅读(...) 评论(...) 编辑 收藏