NHibernate从入门到精通系列(3)——第一个NHibernate应用程序
内容摘要
准备工作
开发流程
程序开发
一、准备工作
1.1开发环境
开发工具:VS2008以上,我使用的是VS2010
数据库:任意关系型数据库,我使用的是SQL Server 2005 Express
1.2测试环境
nunit 2.5.7
二、开发流程
NHibernate程序的开发流程是:
(1).编写领域类与映射文件
(2).使用NHibernate工具生成对应的数据库结构
(3).编写DAO(数据库访问对象)
(4).使用NUnit测试DAO(数据访问对象)的增、删、该、查方法
三、程序开发
3.1 建立Domain项目,如图3.1.1所示。

图3.1.1
编写类文件Product.cs
/// <summary>
/// 商品
/// </summary>
public class Product
{
/// <summary>
/// ID
/// </summary>
public virtual Guid ID { get; set; } /// <summary>
/// 编号
/// </summary>
public virtual string Code { get; set; } /// <summary>
/// 名称
/// </summary>
public virtual string Name { get; set; } /// <summary>
/// 规格
/// </summary>
public virtual string QuantityPerUnit { get; set; } /// <summary>
/// 单位
/// </summary>
public virtual string Unit { get; set; } /// <summary>
/// 售价
/// </summary>
public virtual decimal SellPrice { get; set; } /// <summary>
/// 进价
/// </summary>
public virtual decimal BuyPrice { get; set; } /// <summary>
/// 备注
/// </summary>
public virtual string Remark { get; set; }
}
Product.cs
编写映射文件Product.hbm.xml
<?xml version="1.0" encoding="utf-8" ?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
<class name="Product" table="T_Product" lazy="true" >
<id name="ID" column="ID" type="Guid" >
<generator class="assigned" />
</id> <property name="Code" type="string">
<column name="Code" length=""/>
</property> <property name="Name" type="string">
<column name="Name" length=""/>
</property> <property name="QuantityPerUnit" type="string">
<column name="QuantityPerUnit" length=""/>
</property> <property name="Unit" type="string">
<column name="Unit" length=""/>
</property> <property name="SellPrice" type="decimal">
<column name="SellPrice" precision="" scale=""/>
</property> <property name="BuyPrice" type="decimal">
<column name="BuyPrice" precision="" scale=""/>
</property> <property name="Remark" type="string">
<column name="Remark" length=""/>
</property> </class>
</hibernate-mapping>
Product.hbm.xml
然后,将映射文件“Product.hbm.xml”的属性“生成方式”设置为“嵌入的资源”,如图3.1.2所示。

图3.1.2
3.2 建立名为“NHibernateTest”的项目,如图3.2.1所示

图3.2.1
引用程序集“Antlr3.Runtime.dll”,“Iesi.Collections.dll”,“NHibernate.dll”,“Remotion.Data.Linq.dll”,“nunit.framework.dll”,如图3.2.2所示

图3.2.2
然后音乐Domain项目,复制并粘贴NHibernate的配置模板到项目中,如图3.2.3所示

图3.2.3
修改该文件的属性为“始终复制”
<?xml version="1.0" encoding="utf-8"?>
<!--
This template was written to work with NHibernate.Test.
Copy the template to your NHibernate.Test project folder and rename it in hibernate.cfg.xml and change it
for your own use before compile tests in VisualStudio.
-->
<!-- This is the System.Data.dll provider for SQL Server -->
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernateTest">
<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
<property name="connection.connection_string">
server=.\SQLEXPRESS;database=NHibernateDemo;uid=sa;pwd=;
</property>
<property name="adonet.batch_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="use_outer_join">true</property>
<property name="command_timeout">60</property>
<property name="hbm2ddl.auto">update</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
<mapping assembly="Domain"/>
</session-factory>
</hibernate-configuration>
hibernate.cfg.xml
创建“NHibernateInit.cs”类文件,用于初始化数据库的表结构
[TestFixture]
public class NHibernateInit
{
[Test]
public void InitTest()
{
var cfg = new NHibernate.Cfg.Configuration().Configure("Config/hibernate.cfg.xml");
using (ISessionFactory sessionFactory = cfg.BuildSessionFactory()) { }
}
}
NHibernateInit.cs
复制proxyfactory类的程序集“LinFu.DynamicProxy.dll”和“NHibernate.ByteCode.LinFu.dll”到项目中,并修改生成方式,如图3.2.4所示

图3.2.4
设置项目属性的启动操作,为“启动外部程序”,然后选择NUnit应用程序的路径。如图3.2.5所示。

图3.2.5
打开SQL Server Management Studio Express,创建名为“NHibernateDemo”的数据库,如图3.2.6

图3.2.6
启用NUnit,选择名称“NHibernateTest.dll”的程序集。如图3.2.7所示。接着,点击“run”按钮运行NUnit。

图3.2.7
这时,我们再打开数据库,就会发现,NHibernate已经为我们建立了“T_Product”表,如图3.2.8所示。

图3.2.8
3.3 编写DAO(数据库访问对象),建立名为“Dao”的项目。如图3.3.1所示。

图3.3.1
引用项目所需的程序集,接着编写IProductDao接口和 ProductDao类
public interface IProductDao
{
object Save(Product entity); void Update(Product entity); void Delete(Product entity); Product Get(object id); Product Load(object id); IList<Product> LoadAll();
} public class ProductDao : IProductDao
{
private ISessionFactory sessionFactory; public ProductDao()
{
var cfg = new NHibernate.Cfg.Configuration().Configure("Config/hibernate.cfg.xml");
sessionFactory = cfg.BuildSessionFactory();
} public object Save(Domain.Product entity)
{
using (ISession session = sessionFactory.OpenSession())
{
var id = session.Save(entity);
session.Flush();
return id;
}
} public void Update(Domain.Product entity)
{
using (ISession session = sessionFactory.OpenSession())
{
session.Update(entity);
session.Flush();
}
} public void Delete(Domain.Product entity)
{
using (ISession session = sessionFactory.OpenSession())
{
session.Delete(entity);
session.Flush();
}
} public Domain.Product Get(object id)
{
using (ISession session = sessionFactory.OpenSession())
{
return session.Get<Domain.Product>(id);
}
} public Domain.Product Load(object id)
{
using (ISession session = sessionFactory.OpenSession())
{
return session.Load<Domain.Product>(id);
}
} public IList<Domain.Product> LoadAll()
{
using (ISession session = sessionFactory.OpenSession())
{
return session.Query<Domain.Product>().ToList();
}
}
}
ProductDao
然后在测试项目“NHibernateTest”中编写测试类“ProductDaoTest”。
[TestFixture]
public class ProductDaoTest
{
private IProductDao productDao; [SetUp]
public void Init()
{
productDao = new ProductDao();
} [Test]
public void SaveTest()
{
var product = new Domain.Product
{
ID = Guid.NewGuid(),
BuyPrice = 10M,
Code = "ABC123",
Name = "电脑",
QuantityPerUnit = "20x1",
SellPrice = 11M,
Unit = "台"
}; var obj = this.productDao.Save(product); Assert.NotNull(obj);
} [Test]
public void UpdateTest()
{
var product = this.productDao.LoadAll().FirstOrDefault();
Assert.NotNull(product); product.SellPrice = 12M; Assert.AreEqual(12M, product.SellPrice);
} [Test]
public void DeleteTest()
{
var product = this.productDao.LoadAll().FirstOrDefault();
Assert.NotNull(product); var id = product.ID;
this.productDao.Delete(product);
Assert.Null(this.productDao.Get(id));
} [Test]
public void GetTest()
{
var product = this.productDao.LoadAll().FirstOrDefault();
Assert.NotNull(product); var id = product.ID;
Assert.NotNull(this.productDao.Get(id));
} [Test]
public void LoadTest()
{
var product = this.productDao.LoadAll().FirstOrDefault();
Assert.NotNull(product); var id = product.ID;
Assert.NotNull(this.productDao.Get(id));
} [Test]
public void LoadAllTest()
{
var count = this.productDao.LoadAll().Count;
Assert.True(count > );
}
}
ProductDaoTest
最后运行NUnit测试该项目。效果如图3.3.2所示。

图3.3.2
好了,一个NHibernate完整的项目就做完了。从中我们可以发现,此应用程序项目没有编写一条SQL语句,就能实现数据的增、删、该、查。
这样一来,便简化了我们的项目开发。O(∩_∩)O~
NHibernate从入门到精通系列(3)——第一个NHibernate应用程序的更多相关文章
- NHibernate从入门到精通系列
http://www.cnblogs.com/GoodHelper/archive/2011/02/17/1948744.html NHibernate从入门到精通系列(4)——持久对象的生命周期(上 ...
- [大数据从入门到放弃系列教程]第一个spark分析程序
[大数据从入门到放弃系列教程]第一个spark分析程序 原文链接:http://www.cnblogs.com/blog5277/p/8580007.html 原文作者:博客园--曲高终和寡 **** ...
- NHibernate从入门到精通系列(1)——NHibernate概括
内容摘要 NHibernate简介 ORM简介 NHibernate优缺点 一.NHibernate简介 什么是?NHibernate?NHibernate是一个面向.NET环境的对象/关系数据库映射 ...
- NHibernate从入门到精通系列(2)——NHibernate环境与结构体系
内容摘要 NHibernate的开发环境 NHibernate的结构体系 NHibernate的配置 一.NHibernate的开发环境 NHibernate的英文官方网站为:http://nhfor ...
- NHibernate从入门到精通系列——NHibernate环境与结构体系
内容摘要 NHibernate的开发环境 NHibernate的结构体系 NHibernate的配置 一.NHibernate的开发环境 NHibernate的英文官方网站为:http://nhfor ...
- Provisioning Services 7.6 入门到精通系列之一:PVS前期规划
1. Provisioning Services 产品概述 Provisioning Services (简称PVS)采用了一种与传统映像解决方案截然不同的方法,从根本上改变了硬件与依托硬件而运行的 ...
- Jenkins pipeline 入门到精通系列文章
Jenkins2 入门到精通系列文章. Jenkins2 下载与启动jenkins2 插件安装jenkins2 hellopipelinejenkins2 pipeline介绍jenkins2 jav ...
- 办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时)
办公软件Office PPT 2010视频教程从入门到精通系列教程(22课时) 乔布斯的成功离不开美轮美奂的幻灯片效果,一个成功的商务人士.部门经理也少不了各种各样的PPT幻灯片.绿色资源网给你提供了 ...
- Selenium 入门到精通系列:六
Selenium 入门到精通系列 PS:Checkbox方法 例子 HTML: <html> <head> <title>测试页面</title> &l ...
随机推荐
- View滑动的常见方式
今天头条的面试官问起了实现View滑动的方式,其实前几天刚刚看过,但还是没能答上来,这里再来总结一遍. 1.使用scrollTo/scrollBy 为了实现View滑动,Android专门提供了这两个 ...
- wifislax中的linset软件钓鱼教程
wifislax中很多破解wifi密码的工具,下面就来说说里面的linset软件的钓鱼过程,国内很多人知道这个方法,不过没有总结,youtube上视频一大把,我刚才测试了一把,还是打算记录一下攻击过程 ...
- 教你快速打造PHP MVC框架
简介 MVC框架在现在的开发中相当流行,不论你使用的是JAVA,C#,PHP或者IOS,你肯定都会选择一款框架.虽然不能保证100%的开发语言都会使用框架,但是在PHP社区当中拥有最多数量的MVC框架 ...
- JAVA NIO之文件通道
1.简介 通道是 Java NIO 的核心内容之一,在使用上,通道需和缓存类(ByteBuffer)配合完成读写等操作.与传统的流式 IO 中数据单向流动不同,通道中的数据可以双向流动.通道既可以读, ...
- JS实现键盘监听
不说废话直接上正文: <html> <head> <meta http-equiv="Content-Type" content="text ...
- iOS App 启动性能优化
1. App启动过程 解析Info.plist 加载相关信息,例如如闪屏 沙箱建立.权限检查 Mach-O加载 如果是胖二进制文件,寻找合适当前CPU类别的部分 加载所有依赖的Mach-O文件(递归调 ...
- LeetCode算法一题型一以及解答。
题目: 给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 分析: 普遍方法是直接遍历两遍数组,第一遍用target-nums[i],第二遍找 ...
- node.js与比特币(typescript实现)
BTC中的utxo模型 BTC中引入了许多创新的概念与技术,区块链.PoW共识.RSA加密.萌芽阶段的智能合约等名词是经常被圈内人所提及,诚然这些创新的实现使得BTC变成了一种有可靠性和安全性保证的封 ...
- Alpha冲刺总结
团队成员 陈家权 031502107 赖晓连 031502118 雷晶 031502119 林巧娜 031502125 庄加鑫 031502147 一.项目预期计划及现实进展 项目预期计划 现实进展 ...
- 第1次作业:小菜鸟的平凡IT梦
#1.结缘计算机的始末 ##1.1与计算机相识的几年 作为一个95后,出生在一个互联网开始兴盛的时代.我记得小学的时候,开始知道电脑这个东西,学校有了机房,开始有了所谓的电脑课.那时候计算机对于我来说 ...