Nhibernate横空出世之一:快速启程(NHibernate+MySQL+WPF)

1. 新建工程

      新建WPF应用程序工程SimpleNHibernateTour,做一些准备工作:

(1) 准备组件库

      右键单击Solution,选择在Windows Explorer中打开,新建文件夹,这里命名为Lib,将我们下载的Nhibernate包(如NHibernate-3.0.0.GA-bin.zip)中的必要组件拷贝至改文件夹,为方便起见,这里将Required_Bins文件夹和Required_For_LazyLoading\Castle文件夹下的所有内容都拷贝进刚刚创建的Lib文件夹中,另外还需要添加MySql.Data.dll,以便接下来引用。

(2) 添加Schema

      这里的工作可以使我们在编辑配置接下来的配置文件和映射文件时,可以自动提示。

      右键单击Solution,选择Add>Add Solution Folder选项,创建Solution文件夹,并将其重命名,例如Schema。

      右击Schema文件夹,选择Add> Existing Item,选择Lib下的两个xsd文件,即nhibernate-configuration.xsd和nhibernate-mapping.xsd。

      在使用过程中,可以在XML文件属性中,为Schema选项添加上面相应的xsd文件。

2. 配置文件

      有多种方法使用配置文件,比如通过configure文件,如App.config,web.config等,也可以通过代码,或者通过单独的配置文件hibernate.cfg.xml,我们选择使用单独的配置文件。

      在工程中新建XML文件,命名为hibernate.cfg.xml,并指定相应Schema,如下图所示:

clip_image002

      配置文件如下所示:

代码
<?xml version="1.0" encoding="utf-8" ?>


<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
<!-- ISessionFactory实例 -->
<session-factory>
<!-- 属性 -->
<!-- 设置connection provider,NHibernate将用之连接数据库 -->
<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
<!-- 设置所用driver,在此,我们为MySQL数据库选择MySqlDataDriver -->
<property name="connection.driver_class">NHibernate.Driver.MySqlDataDriver</property>
<!-- 设置连接到数据库的connection string -->
<property name="connection.connection_string">***********</property>
<!-- 为特定数据库选择Dialect,这里选择使用MySQL5Dialect -->
<property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
<!-- 映射文件 -->
<mapping resource="SimpleNHibernateTour.Employee.hbm.xml" assembly="SimpleNHibernateTour" />
</session-factory>
</hibernate-configuration>

 

3. 创建持久化类

 

代码
namespace SimpleNHibernateTour
{
public class Employee
{
public Employee()
{ }

private int id;
public virtual int Id
{
get { return id; }
set { id = value; }
}

private string name;
public virtual string Name
{
get { return name; }
set { name = value; }
}

private int age;
public virtual int Age
{
get { return age; }
set { age = value; }
}
}
}

 

 

 

      Company.cs包含3个属性,通过一定的的规则,可以与数据库中相应表的字段进行关联。在Nhibernate中,不仅仅是属性类型可以被映射,所有的.NET类型和原型(primitive)都可以被映射,包括命名空间System.Collections下的类。

在代码中,所有的pulic属性都被定义为virtual,具体原因可以参见文档(Documentation)。

4. 映射文件

      在工程中建立Employee.hbm.xml,注意要与配置文件中的生命对应起来,此外,在映射文件属性栏中,更改Build Action选项为Embedded Resources(如下图所示),这样做可以使NHibernate在运行时进行解析,从而在使用映射时达到简化编码的目的。

clip_image004

      也可以使用上面讲述的方法为映射文件选择Schema。

5. 创建数据表

CREATE TABLE `employee` (
`id`
int(11) NOT NULL,
`name`
varchar(100) NOT NULL,
`age`
int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE
=InnoDB DEFAULT CHARSET=gbk;

6. 测试

      测试方法很多,这里使用WPF简单进行演示,这里只做最简单的演示,在以后的文章中可以做绑定,等等。

      在主窗体中拖放一个Label、两个TextBox以及两个按钮,分别命名为labelId,textBoxName、textBoxAge和buttonUpdate、buttonDelete。

如下图所示(效果图):

clip_image006

      同时添加事件,代码如下所示:

代码
namespace SimpleNHibernateTour
{
public partial class MainWindow : Window
{
Employee emp;
public MainWindow()
{
InitializeComponent();
}

private void Window_Loaded(object sender, RoutedEventArgs e)
{
// 加载数据,因此在数据表中默认情况下要有数据存在
IList employees;
ISessionFactory sf
= new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
using (ISession session = sf.OpenSession())
{
ICriteria criteria
= session.CreateCriteria(typeof(Employee));
employees
= criteria.List();
session.Close();
}
sf.Close();
emp
= (Employee)employees[0];
labelId.Content
= emp.Id;
textBoxName.Text
= emp.Name;
textBoxAge.Text
= emp.Age.ToString();
}

private void buttonUpdate_Click(object sender, RoutedEventArgs e)
{
// 对数据进行修改
ISessionFactory sf = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();

using (ISession session = sf.OpenSession())
{
emp
= (Employee)session.Load(typeof(Employee), int.Parse(labelId.Content.ToString()));
emp.Name
= textBoxName.Text;
emp.Age
= Convert.ToInt32(textBoxAge.Text);
session.SaveOrUpdate(emp);
session.Flush();
session.Close();
}

sf.Close();
}

private void buttonDelete_Click(object sender, RoutedEventArgs e)
{
// 删除数据
ISessionFactory sf = new NHibernate.Cfg.Configuration().Configure().BuildSessionFactory();
using (ISession session = sf.OpenSession())
{
emp
= (Employee)session.Load(typeof(Employee), int.Parse(labelId.Content.ToString()));
session.Delete(emp);
session.Flush();
session.Close();
}
sf.Close();
}
}
}

 

      至于什么时候该引用哪个组件,需要我们自己去探索,在探索中成长。

7. 总结

      本片文章讲述了如何快速使用Nhibernate,一些细节难免有疏漏,在编写程序过程中,出于简洁和快捷的考虑,程序上难免会有不足之处,但如果达到“快速上手”Nhibernate的目的,那就成功了!

8. 参考文章

http://www.codeproject.com/KB/dotnet/mysqlnhibernate.aspx

posted @ 2010-12-07 18:19  玄黄道长  阅读(4220)  评论(3编辑  收藏  举报