LINQ to SQL、NHibernate比较(三)-- NHibernate实例
在上一篇博文中,为朋友们共享了一个简单的LINQ to SQL示例系统程序,为了比较LINQ to SQL和NHibernate在使用上不同,这里使用NHibernate实现一个完全一样的系统。
源码下载/Files/chenl861004/MyNHibernate.rar
1、 简单系统
请参见LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例
2、 系统实现
使用与LINQ to SQL、NHibernate比较(二)-- LINQ to SQL实例基本相同的方法来建立这个简单系统,不同的是现在实体类不是拖过去就自动生成的,而是要我们自己来写了。
Item
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyNHibernate.DataObj
{
/**//// <summary>
/// Item表对应的类
/// </summary>
class Item
{
字段#region 字段
private int iD;//物料编号
private string storage;//所在仓库
private string itemKind;//物料类型
#endregion
属性#region 属性
/**//// <summary>
/// 物料类型
/// </summary>
public virtual int ID
{
get { return iD; }
set
{
if (iD != value)
{
iD = value;
}
}
}
/**//// <summary>
/// 所在仓库
/// </summary>
public virtual string Storage
{
get { return storage; }
set
{
if (storage != value)
{
storage = value;
}
}
}
/**//// <summary>
/// 物料类型
/// </summary>
public virtual string ItemKind
{
get { return itemKind; }
set
{
if (itemKind != value)
{
itemKind = value;
}
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyNHibernate.DataObj
{
/**//// <summary>
/// Item表对应的类
/// </summary>
class Item
{
字段#region 字段
private int iD;//物料编号
private string storage;//所在仓库
private string itemKind;//物料类型
#endregion
属性#region 属性
/**//// <summary>
/// 物料类型
/// </summary>
public virtual int ID
{
get { return iD; }
set
{
if (iD != value)
{
iD = value;
}
}
}
/**//// <summary>
/// 所在仓库
/// </summary>
public virtual string Storage
{
get { return storage; }
set
{
if (storage != value)
{
storage = value;
}
}
}
/**//// <summary>
/// 物料类型
/// </summary>
public virtual string ItemKind
{
get { return itemKind; }
set
{
if (itemKind != value)
{
itemKind = value;
}
}
}
#endregion
}
}
映射文件:
Item.hbm.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
default-lazy="false"
assembly="MyNHibernate"
namespace="MyNHibernate.DataObj"><!--assembly:程序集;namespace:命名空间-->
<class
name="Item"
table="Item" >
<id
name="ID"
type="Int32"
column="物料编号"
/>
<property
name="Storage"
column="所在仓库"
type="String"
/>
<property
name="ItemKind"
column="物料类型"
type="String"
/>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping
xmlns="urn:nhibernate-mapping-2.2"
default-lazy="false"
assembly="MyNHibernate"
namespace="MyNHibernate.DataObj"><!--assembly:程序集;namespace:命名空间-->
<class
name="Item"
table="Item" >
<id
name="ID"
type="Int32"
column="物料编号"
/>
<property
name="Storage"
column="所在仓库"
type="String"
/>
<property
name="ItemKind"
column="物料类型"
type="String"
/>
</class>
</hibernate-mapping>
其他两个类类似,就不贴出来了。
数据库连接类:
DataConnection
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
namespace MyNHibernate.Methods
{
/**//// <summary>
/// 数据库连接的类(多个界面共享一个链接,提高效率)
/// </summary>
class DataConnection
{
字段#region 字段
//配置类,读取全局配置文件hibernate.cfg.xml的相关信息
//包括数据源信息和需要加载的实体类映射文件
private static Configuration config = new Configuration().Configure();
//工厂类,ISessionFactory是一个全局对象,允许多线程同时访问。
private static ISessionFactory factory = config.BuildSessionFactory();
#endregion
属性#region 属性
/**//// <summary>
/// 配置类
/// </summary>
public static Configuration Config
{
get { return config; }
}
/**//// <summary>
/// 工厂类
/// </summary>
public static ISessionFactory Factoty
{
get { return factory; }
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
namespace MyNHibernate.Methods
{
/**//// <summary>
/// 数据库连接的类(多个界面共享一个链接,提高效率)
/// </summary>
class DataConnection
{
字段#region 字段
//配置类,读取全局配置文件hibernate.cfg.xml的相关信息
//包括数据源信息和需要加载的实体类映射文件
private static Configuration config = new Configuration().Configure();
//工厂类,ISessionFactory是一个全局对象,允许多线程同时访问。
private static ISessionFactory factory = config.BuildSessionFactory();
#endregion
属性#region 属性
/**//// <summary>
/// 配置类
/// </summary>
public static Configuration Config
{
get { return config; }
}
/**//// <summary>
/// 工厂类
/// </summary>
public static ISessionFactory Factoty
{
get { return factory; }
}
#endregion
}
}
窗体方法类:
Methods
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Collections;
using System.Transactions;
using NHibernate;
using NHibernate.Cfg;
using MyNHibernate.DataObj;
namespace MyNHibernate.Methods
{
/**//// <summary>
/// 泛型类,传入类型参数
/// </summary>
/// <typeparam name="TbeToOpe"></typeparam>
class Methods<TbeToOpe>
{
字段#region 字段
//会话类,每个界面每次都实例化一个,关闭窗口时关闭连接
private static ISession session = DataConnection.Factoty.OpenSession();
#endregion
方法#region 方法
/**//// <summary>
/// 取得数据源
/// </summary>
public IList GetDataSource()
{
return session.CreateCriteria(typeof(TbeToOpe)).List();
}
/**//// <summary>
/// 一键式实现实体类与数据库同步
/// </summary>
public void DoChange(BindingSource bs)
{
//实例化事务
using (TransactionScope ts = new TransactionScope())
{
try
{
//选择对话框
if (MessageBox.Show("确定执行对数据库的操作吗?", "确定操作",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
//增删改
InsUpDel(bs);
//提交到数据库
session.Flush();
MessageBox.Show("对数据库的操作成功!", "操作成功!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//捕捉异常
catch (Exception ex)
{
MessageBox.Show(ex.Message, "操作失败", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//事务结束
ts.Complete();
}
}
/**//// <summary>
/// 窗体关闭事件
/// </summary>
public void FormsClosing(BindingSource bs, FormClosingEventArgs e)
{
using (TransactionScope ts = new TransactionScope())
{
try
{
DialogResult dr = MessageBox.Show("确定保存对数据库的操作吗?", "退出提示",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
//增删改
InsUpDel(bs);
//提交到数据库
session.Flush();
}
else if (dr == DialogResult.Cancel)
{
e.Cancel = true;
}
}
//捕捉异常
catch (Exception ex)
{
e.Cancel = true;
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//事务结束
ts.Complete();
}
}
/**//// <summary>
/// 实现与数据库的同步
/// </summary>
/// <param name="bs"></param>
private void InsUpDel(BindingSource bs)
{
foreach(TbeToOpe tto in bs)
{
//增、改
session.SaveOrUpdateCopy(tto);
}
foreach (TbeToOpe tto in GetDataSource())
{
//删
if (!bs.Contains(tto))
session.Delete(tto);
}
}
#endregion
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Windows.Forms;
using System.Collections;
using System.Transactions;
using NHibernate;
using NHibernate.Cfg;
using MyNHibernate.DataObj;
namespace MyNHibernate.Methods
{
/**//// <summary>
/// 泛型类,传入类型参数
/// </summary>
/// <typeparam name="TbeToOpe"></typeparam>
class Methods<TbeToOpe>
{
字段#region 字段
//会话类,每个界面每次都实例化一个,关闭窗口时关闭连接
private static ISession session = DataConnection.Factoty.OpenSession();
#endregion
方法#region 方法
/**//// <summary>
/// 取得数据源
/// </summary>
public IList GetDataSource()
{
return session.CreateCriteria(typeof(TbeToOpe)).List();
}
/**//// <summary>
/// 一键式实现实体类与数据库同步
/// </summary>
public void DoChange(BindingSource bs)
{
//实例化事务
using (TransactionScope ts = new TransactionScope())
{
try
{
//选择对话框
if (MessageBox.Show("确定执行对数据库的操作吗?", "确定操作",
MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
//增删改
InsUpDel(bs);
//提交到数据库
session.Flush();
MessageBox.Show("对数据库的操作成功!", "操作成功!", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
//捕捉异常
catch (Exception ex)
{
MessageBox.Show(ex.Message, "操作失败", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//事务结束
ts.Complete();
}
}
/**//// <summary>
/// 窗体关闭事件
/// </summary>
public void FormsClosing(BindingSource bs, FormClosingEventArgs e)
{
using (TransactionScope ts = new TransactionScope())
{
try
{
DialogResult dr = MessageBox.Show("确定保存对数据库的操作吗?", "退出提示",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (dr == DialogResult.Yes)
{
//增删改
InsUpDel(bs);
//提交到数据库
session.Flush();
}
else if (dr == DialogResult.Cancel)
{
e.Cancel = true;
}
}
//捕捉异常
catch (Exception ex)
{
e.Cancel = true;
MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
//事务结束
ts.Complete();
}
}
/**//// <summary>
/// 实现与数据库的同步
/// </summary>
/// <param name="bs"></param>
private void InsUpDel(BindingSource bs)
{
foreach(TbeToOpe tto in bs)
{
//增、改
session.SaveOrUpdateCopy(tto);
}
foreach (TbeToOpe tto in GetDataSource())
{
//删
if (!bs.Contains(tto))
session.Delete(tto);
}
}
#endregion
}
}
ItemForm
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyNHibernate.Methods;
using MyNHibernate.DataObj;
namespace MyNHibernate
{
/**//// <summary>
/// Item处理窗体
/// </summary>
public partial class ItemForm : Form
{
//实例化一个方法类
Methods<Item> ItemMethods = new Methods<Item>();
/**//// <summary>
/// 构造函数
/// </summary>
public ItemForm()
{
InitializeComponent();
}
//窗体加载
private void Form1_Load(object sender, EventArgs e)
{
//初始化
itemBindingSource.DataSource = ItemMethods.GetDataSource();
}
/**//// <summary>
/// 一键式实现数据库增删改
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonGo_Click(object sender, EventArgs e)
{
ItemMethods.DoChange(itemBindingSource);
//重新绑定数据源
itemBindingSource.DataSource = ItemMethods.GetDataSource();
}
//窗体关闭
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ItemMethods.FormsClosing(itemBindingSource, e);
}
}
}
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MyNHibernate.Methods;
using MyNHibernate.DataObj;
namespace MyNHibernate
{
/**//// <summary>
/// Item处理窗体
/// </summary>
public partial class ItemForm : Form
{
//实例化一个方法类
Methods<Item> ItemMethods = new Methods<Item>();
/**//// <summary>
/// 构造函数
/// </summary>
public ItemForm()
{
InitializeComponent();
}
//窗体加载
private void Form1_Load(object sender, EventArgs e)
{
//初始化
itemBindingSource.DataSource = ItemMethods.GetDataSource();
}
/**//// <summary>
/// 一键式实现数据库增删改
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonGo_Click(object sender, EventArgs e)
{
ItemMethods.DoChange(itemBindingSource);
//重新绑定数据源
itemBindingSource.DataSource = ItemMethods.GetDataSource();
}
//窗体关闭
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
ItemMethods.FormsClosing(itemBindingSource, e);
}
}
}
3、小结
NHibernate还是很强大的,不过配文件和映射文件刚开始学习时一直不能正确配置,导致这个实例多半的时间是在写这些文件。。。囧。。。