大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)
大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)
分类: C#2013-08-10 18:47 1589人阅读 评论(5) 收藏 举报
NHibernateNUnitVisual Studio 2012
如果你没听过Nhibernate or NUnit,那么,恭喜你,和我一样,握个手吧。如果你已经是个老酱油了,那就道不同不带你玩了,请自觉绕行,,,。谨以此文献给像我这样广大的小白同胞们(鼓掌)!
话说2013年某月某日,听一武林前辈提起 NHibernate ,小白我顿时大脑空白,这是个啥么东东啊,在强烈好奇心的驱使下,我决定先去吃晚饭,回来后便将此事忘掉了,。。。在此我只想说一句:我不是故意的!前几日,又偶闻坊间传言,话说欧特曼打小怪兽时,所使用的招式中就有NHibernate ANDNUnit,这下小白我可长记性了,为啥妮?因为像我这样广大小白的终极愿望就是穷极毕生之所学,打倒人世间一切妖魔鬼怪啊。话不多说,立马招来谷歌度娘拷打一番,根据“坦白从宽、抗拒从严”的原则,这俩小子把NHibernate和Nunit的勾当一五一十的全都招了出来,我心甚慰啊……原来NHibernate起源于java学派久负盛名的三大框架SSH之一:Hibernate。好吧,如果你和我一样,对java学派嗤之以鼻的话,那我就再废话一些:首先,你要明白,NHibernate在.NET中的作用和Hibernate在JAVA中的作用一样;第二,他们都是开源的东东;第三,他们都是一种对象关系数据库映射框架。第三点要好好理解哦,“对象”,.NET和java都是面向对象的,通俗点就是里面都是各种class类;“关系数据库”,MS SQL,ORACLE,etc,就是指的它们了;“映射“,就是在指hibernate在关系数据库和我们面向对象class之间搭起了一座桥梁。因此,有了这个,我们就可以轻松的使用面向对象的思维来编写数据层了,至于数据层如何与数据库打交道,就交给hibernate去处理了。那么NUnit 呢?这个简单,说白了,就一个测试工具,我们在里面写好测试代码,程序自动帮我们做测试,吼吼。说了那么多,其实,我也搞不明白,你们到底懂没懂……,至此,如果广大同胞们脑海中还是没有一丝波澜的话,那就请各位自己去拷打一番谷歌度娘吧。
由于NHibernate和NUnit 的东西实在太多,而小白我功力有限,所以,给大家推荐两个很好的博客,里面写的都很详细了:
1,NHibernate之旅系列文章导航 http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html
2,NHibernate从入门到精通系列http://www.cnblogs.com/GoodHelper/archive/2011/02/14/nhiberante_01.html
这两个博客里有些内容重叠了,但我还是建议大家都从头到尾好好读一下,毕竟我们是小白嘛,
不过两个博客千好万好,只有一点不好,就是年代久远,里面的示例很多地方语法都改变了,这下可把我这小伙伴给惊呆了,。还好小白我心里素质好,经过一番冥思苦想,总算一切搞定,下周二就七夕了,我也没啥好送的,就带大家一起来做一个NHibernate+NUnit的Demo吧,
开发环境:VS 2012 ,SQL Server 2008,NHibernate 3.3.3 ,NUnit 2.6.2
NHibernate 下载地址:NHibernate Forge
NUnit 下载地址:NUnit
当然了,稍后我会把Demo+NHibernate3.3.3+NUnit 2.6.2 一起打包,大家可以直接去下载。
Demo 下载地址:Demo
下面就正式开始了:
1,打开VS2012,新建项目,选择类库,起名为:Domain。确定
2,把自带的Class1.cs删掉,新建一个Student类。代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace Domain
- {
- /// <summary>
- /// 学生类
- /// </summary>
- public class Student
- {
- /// <summary>
- /// ID
- /// </summary>
- public virtual int ID { get; set; }
- /// <summary>
- /// 学生姓名
- /// </summary>
- public virtual string Name { get; set; }
- /// <summary>
- /// 学生性别
- /// </summary>
- public virtual string Sex { get; set; }
- /// <summary>
- /// 学生年龄
- /// </summary>
- public virtual int Age { get; set; }
- }
- }
3,添加一个XML文件,取名为:Student.hbm.xml,如图:
此时,目录结构是这样的:
4,编写Student.hbm.xml 映射文件,代码如下:
[html] view plaincopyprint?
- <?xml version="1.0" encoding="utf-8" ?>
- <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
- <class name="Student" table="T_Student" lazy="true">
- <id name="ID" column="ID" unsaved-value="0">
- <generator class="native"></generator>
- </id>
- <property name="Name" type="string" column="StuName" length="20" not-null="true"></property>
- <property name="Sex" type="string" column="StuSex" length="2"></property>
- <property name="Age" type="Int32" column="StuAge"></property>
- </class>
- </hibernate-mapping>
XML 映射文件的编写是NHibernate中关键的一步,如果你没有预读那两篇博客的话,估计这里就看不懂了。注意:编写XML文件之前,记得把下载的NHibernate中的nhibernate-mapping.xsd文件和nhibernate-configuration.xsd文件放到C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas目录下(我的是win7 64, 因机器不一,如果不知道放哪的话,就百度下吧),这样,编写xml文件时,VS就会有智能提示了。
5,在Student.hbm.xml 文件上右击,选择”属性“,将xml文件的生成操作属性由”内容“改为”嵌入的资源“。如下图:
6,在项目解决方案上右击,选择添加新建项目,添加一个新的类库,取名为:NHibernateTest。(其实,这就是我们利用UNit 进行单元测试的地方)如图:
将新建类库中默认的Class1.cs删掉,此时,目录结构是这样的:
7,在NHibernateTest 项目中,添加对我们刚才新建的Domain类库的引用,以及添加我们下载的NHibernate和NUnit 程序集的引用。如图:
引用添加完毕后,就是下面这个样子的,
10,把下载的NHibernate 中Configuration_Templates文件夹下的MSSQL.cfg.xml文件复制粘贴到NHibernateTest 类库中,并重命名为:hibernate.cfg.xml 并修改文件如下:
[html] view plaincopyprint?
- <?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="NHibernate.Test">
- <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
- <property name="connection.connection_string">
- Server=(local);initial catalog=nhibernate;Integrated Security=SSPI
- </property>
- <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
- <!--添加下面这行代码,除此之外,其它都不用改动,当然,你也可以修改上面的数据库链接字符串-->
- <mapping assembly="Domain"/>
- </session-factory>
- </hibernate-configuration>
然后,在hibernate.cfg.xml文件上右击,选择属性,将xml文件的复制到输入目录属性修改为:始终复制
11,添加NHibernateTest.cs类,代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using NHibernate;
- using NHibernate.Tool.hbm2ddl;
- using NUnit.Framework;
- namespace NHibernateTest
- {
- [TestFixture]
- public class NHibernateInit
- {
- [Test]
- public void InitTest()
- {
- var cfg = new NHibernate.Cfg.Configuration().Configure(System.AppDomain.CurrentDomain.BaseDirectory + "\\hibernate.cfg.xml");
- new SchemaExport(cfg).Execute(true, true, false);
- using (ISessionFactory sessionFactory = cfg.BuildSessionFactory()) { }
- }
- }
- }
12,打开SQL Server 08,新建一个nhibernate 数据库
[sql] view plaincopyprint?
- create database nhibernate
13,在 NHibernateTest 类库上右键,选择属性,切换到”调试“选项卡,单击”启动外部调试“,浏览,选择Nunit.exe 程序。(注意:前提是你已经安装了文章开头时让你下载的Nunit 2.6.2.msi程序),效果如下图所示:
14,点击一下”全部保存“,然后在整个的项目解决方案上右键,选择”生成解决方案“。然后,将NHibernateTest 类库右键,设为启动项目。F5,运行程序
此时,我们看到NUnit.exe已经启动了,在NUnit窗口中,选择:"File"->”new project“,文件名为:NHibernateTest.nunit,点击保存。此时,窗口依然什么都没有。再选择:"Project"->"Add assembly",在弹出的对话框中,找到我们的NHibernateTest类库生成的dll文件,点击打开,如下图:
15,单击NUnit窗口中的Run按钮,此时,NUnit 会自动执行我们的NHibernateTest 类库中的方法。这时,窗口应该是下面这样的:
16,此时,打开数据库,会发现,我们的T_Student数据表已经被自动创建好了。
小伙伴们,你们有没有被惊呆呢?是不是很神奇的东东?哈哈……我发现写文章真是个体力活,受不了了……
唉,没办法,本着对广大的小伙伴尽职尽责的高度使命感,小白我决定继续码字……(鼓掌)
这样测试的话,每次我们都还要启动外部程序NUnit,相信有的小伙伴不乐意了,放心好了,我们可以通过安装插件的方式,解决这个问题(注意:此过程需联网)。
在 VS2012 中,选择:”工具“=》”扩展和更新“,在弹出的对话框中,单击”联机“标签,之后再在搜索框中输入:”NUnit“ ,回车,效果如下图所示:
选择”下载“,下载完毕后,会提示你安装,你直接选择安装就可以了。安装完毕后,重启一下VS。重启之后,选择菜单栏中的:”测试“-》”窗口“-》”测试资源管理器“。然后再重新生成一下整个项目解决方案,这时候,我们在”测试资源管理器“中就可以看到我们的NHibernateTest 测试类了。在这里,我们可以选择全部运行,也可以在单独的方法上右键,选择运行或调试。
下面,我又新写了几个测试方法,分别测试往T_Student表中存入数据,取出数据。NHibernateInit.cs 文件代码如下:
[csharp] view plaincopyprint?
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using NHibernate;
- using NHibernate.Tool.hbm2ddl;
- using NUnit.Framework;
- namespace NHibernateTest
- {
- [TestFixture]//定义一个测试类,里面可以包含很多测试函数和初始化、销毁函数。
- public class NHibernateInit
- {
- [Test]//定义一个独立的测试函数。
- public void InitTest()
- {
- var cfg = new NHibernate.Cfg.Configuration().Configure(System.AppDomain.CurrentDomain.BaseDirectory + "\\hibernate.cfg.xml");
- new SchemaExport(cfg).Execute(true, true, false);
- using (ISessionFactory sessionFactory = cfg.BuildSessionFactory()) { }
- }
- private ISessionFactory _sessionFactory;
- [SetUp]//定义测试函数初始化函数,每个测试函数运行前都会被调用一次。
- public void InitSessionFactory()
- {
- var cfg = new NHibernate.Cfg.Configuration().Configure(System.AppDomain.CurrentDomain.BaseDirectory + "\\hibernate.cfg.xml");
- _sessionFactory = cfg.BuildSessionFactory();
- }
- [Test]
- public void SaveTest()
- {
- var stu = new Domain.Student()
- {
- Name = "张三",
- Sex = "M",
- Age = 20
- };
- using (ISession session = _sessionFactory.OpenSession())
- {
- try
- {
- object obj = session.Save(stu);
- session.Flush();
- Assert.NotNull(obj);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
- [Test]
- public void SelectTest()
- {
- using (ISession session = _sessionFactory.OpenSession())
- {
- Domain.Student stu = session.Get<Domain.Student>(1);
- Assert.NotNull(stu);
- Console.WriteLine(stu.Name);
- }
- }
- }
- }
测试结果如下图所示:
OK了,到此为止,算是把NHibernate+NUnit 的demo完整演示一遍了,不知道各位小伙伴们看懂了没?末尾了,免不得再唠叨一句:珍爱生命,远离IT。。。。
注:关于使用NUnit 测试和 MS 测试框架之间的区别,大家可以去看我转载的一篇文章:Nunit Test 和 MS Test 的区别
大家一起来学 NHibernate+NUnit (VS2012+SQL Server2008)的更多相关文章
- NHibernate+NUnit (VS2012+SQL Server2008) (转)
源博客:http://blog.csdn.net/jiajiayouba/article/details/9877875 首先,你要明白,NHibernate在.NET中的作用和Hibernate在J ...
- 用LinqPad查看Nhibernate生成的sql语句
使用Nhibernate开发一般都要对Nhibernate生成的sql语句进行查看及分析,查看Nhibernate生成的sql语句,可以使用NHProfiler和log4net.但NHProfiler ...
- nhibernate中执行SQL语句
在有些时候,可能需要直接执行SQL语句.存储过程等,但nhibernate并没有提供一种让我们执行SQL语句的方法,不过可以通过一些间接的方法来实现. 下面给出一个在nhibernate中执行SQL语 ...
- NHibernate直接执行SQL进行插入
有时候,需要用NHibernate直接执行SQL进行数据insert或update. 怎么写呢?简单一点的,可以直接拼凑出来的SQL,这样写: using NHibernate; StringBuil ...
- SQL Server2008附加数据库失败
今天旁晚时分,我准备把老师在上课时候发给我们的一个数据库附加到我的SQL Server2008上面去,本来在学校机房用的SQL Server2000是很顺利地就成功了,但是把*.mdf文件附加到我的0 ...
- sql server2008配置管理工具服务显示远程过程调用失败
SQL SERVER2008配置管理工具服务显示远程过程调用失败 前两天,装了VS2012后,打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示:(如图) 上网搜了,试了 ...
- 记录SQL Server2008日志文件损坏的恢复过程
记录SQL Server2008日志文件损坏的恢复过程: 环境: 系 统:Windows Server2003 数据库:SQL Server2008 故障原因: 通过mstsc链接同一服务器时,用户界 ...
- SQL Server2008附加数据库之后显示为只读时解决方法
啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定. 方案二: 使用sa登录SQL Server2008附加数据库 ...
- win8安装SQL Server2008企业版
win8 系统,安装的时候要先安装SQL Server2008企业版 再安装Visual studio2010,不然SQL Server会有问题.
随机推荐
- 判断下列语句是否正确,如果有错误,请指出错误所在?interface A{
判断下列语句是否正确,如果有错误,请指出错误所在? interface A{ int add(final A a); } class B implements A{ long add(final A ...
- 框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口
框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口. 与Frame不同,Applet是在网页中显示的,也可以通过添加Panel进行组件布局. package TomAwt; im ...
- URL编码,空格和+
下表中列出了一些URL特殊符号及编码 + URL 中+号表示空格 %2B 空格 URL中的空格可以用+号或者编码 %20 / 分隔目录和子目录 %2F ? 分隔实际的URL和参数 %3F % 指定特殊 ...
- 你不知道的C#ToString方法
我们都知道,String类型的ToString方法在我们平时的编程中应用非常的广泛,那么,对于那些很有用但又很少用的方法,你又熟悉几个呢?下面直接上代码: .ToString("C" ...
- js json ie不支持json
JSON是包含在JScript 5.8中,而为了向下兼容ie8只有在文档模式是”Internet Explorer 8 Standards”的时候才使用JScripte 5.8,其他时候使用JScri ...
- XStream的基本使用
先准备两个bean public class Book { private int bookId; private String bookName; private String bookCode; ...
- Numpy常用金融计算(一)
In [41]: a=[1,2,3,4,5,5,6,6,7,8,8,9,9] # list类型数组 In [42]: b=nu.mean(a) #调用numpy.mean方法计算数组元素的算术平均值 ...
- 033 调整数组顺序使奇数位于偶数前面(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php?pid=1516 题目描写叙述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序.使得全部的奇数位于数组的 ...
- Linux中buffer/cache,swap,虚拟内存和page ++
1.Buffer 和 cache Free 命令相对于top 提供了更简洁的查看系统内存使用情况: [apptest@vs022 ~]$ free -m ——以MB为单位 ...
- Kotlin——高级篇(四):集合(Array、List、Set、Map)基础
在实际的项目开发中,集合的运用可以说是多不胜数.不过Kotlin中的集合运用和Java中还是有很大的差别,他们两者之间,除了集合的类型相同以外,还包含集合的初始化的不同,以及Kotlin对于集合封装特 ...