C#——Nhibernate探索
C#—Nhibernate探索
本篇文章,让我们一起来探索Nhibernate。
首先我们去搜索Nhibernate下载地址,如下链接所示。
该版本可能是最新版,我下载的4.0.4.GA。其中GA意思我没搞清楚。不过应该不重要。
https://sourceforge.net/projects/nhibernate/
分析文件内容
下载完成后,解压缩,我们看到文件夹内容如下图所示。

我们可以分析得出,其中Required_Bins存储的是类库和其他资源;字面的意思Required,是必须文件。
打开Required文件夹,我们看到里面是这样的。

这里有两个类库;可以分析得出,这两个类库是要被引用的。
类库拥有对应的XML,没找到具体使用该XML的方法。所以暂时不去理他。
NHibernate.pdb应该是没有用的。估计是作者忘记删除了。
nhibernate-configuration.xsd和nhibernate-mapping.xsd两个文件暂时不知道要干什么用的。
但看到.xsd文件,第一时间反应,他们应该是用来帮助开发者,快速生成配置文件用的。为了保险起见,我们上网查询一下。
查询结果:
查询结果是,他们俩是【文件智能提示功能】用的。
且nhibernate-configuration.xsd和nhibernate-mapping.xsd是要放到c盘的,路径如下:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas
因为是我用的是vs2012,所以,我找的路径是Microsoft Visual Studio 11.0。并将文件放在了那里面。
虽然感觉,这俩文件好像不是这么用的,但由于可以判断它们并不影响程序运行,所以,先且不管他们,等程序运行起来后,再删除他们试试。
再之后,我上网调查了下Nhibernate的应用。
上网调查后,发现Nhibernate有Castle框架、LinFu框架、Spring.Net三种。
看起来很复杂,文章有很多,写的又很复杂,于是我放弃调查,直接尝试使用,首先第一步,直接引用类库。
一、建立了一个类库程序,引用Iesi.Collections.dll和NHibernate.dll两个DLL。
接下来,我们开始建立持久化对象。
public class Test
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
接下来建立持久化对象与数据库的映射。再次上网调查。
调查结果:
对象与数据库的映射是保存在XML文件中的,于是我配置XML映射文件如下。
该XML文件的属性,要求设置其生成操作为【嵌入的资源】。
但我怕它丢失,还给他设置了始终复制的属性。
XML文件如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="NherbinateHelper"
namespace="NherbinateHelper">
<class name ="Test">
<id name="Id" column ="Id">
<generator class ="native"/>
</id>
<property name ="Name"/>
</class>
</hibernate-mapping>
再然后,我需要建立数据库连接的类。
再次上网调查。编写NHibernateHelper如下。
public class NHibernateHelper
{
private ISessionFactory _sessionFactory;
public NHibernateHelper()
{
_sessionFactory = GetSessionFactory();
}
private ISessionFactory GetSessionFactory()
{
return (new Configuration()).Configure().BuildSessionFactory();
}
public ISession GetSession()
{
return _sessionFactory.OpenSession();
}
}
因为我们没有显示设置数据库连接字符串,所以,如果程序可以运行,那么这个类,一定会读配置文件中SQL字符串连接。
然后,我们建立domain(域),添加对Text持久化对象的增删改查的方法。
public class NHibernateSample
{
protected ISession Session { get; set; }
public NHibernateSample(ISession session)
{
Session = session;
}
public void CreateCustomer(Test test)
{
Session.Save(test);
Session.Flush();
}
public Test GetCustomerById(int Id)
{
return Session.Get<Test>(Id);
}
}
再然后,我们新建一个控制台程序,用于测试我们编写的这个NHibernate,是否可以正常运行。
编写测试类代码如下。
public class NHibernateSampleFixture
{
private NHibernateSample _sample;
public NHibernateSampleFixture()
{
_sample = new NHibernateSample(new NHibernateHelper().GetSession());
}
public void GetCustomerByIdTest()
{
var tempCutomer = new Test { Name = "李" };
_sample.CreateCustomer(tempCutomer);
Test customer = _sample.GetCustomerById(1);
int customerId = customer.Id;
}
}
main函数调用如下:
class Program
{
static void Main(string[] args)
{
NHibernateSampleFixture f = new NHibernateSampleFixture();
f.GetCustomerByIdTest();
}
}
测试结果是失败,因为,我们还没有在任何地方设置数据库连接字符串。所以推断,缺少了配置数据库连接的文件。
接着,我打开文件夹了Configuration_Templates。
发现Configuration_Templates文件夹下有如下文件。

我推断,这里就是数据库连接字符串的模板。
由于我使用的数据库是sqlserver,所以,我复制了mssql.cfg.xml。
然后将复制的文件,黏贴到测试的控制台程序下,然后改名为《hibernate.cfg.xml》。
这里测试了下,貌似不改名不好使,配置文件内容如下
【PS:我始终没搞懂,XML中的CFG代表什么意思。】
<?xml version="1.0" encoding="utf-8"?>
<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=SKY-20160718RXO\SA;initial catalog=Nherbinate;Integrated Security=SSPI;
</property>
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
<mapping assembly="NherbinateHelper"/>
</session-factory>
</hibernate-configuration>
因为我连接的是sqlserver2012,所以配置文件里,我将原始版SQL2008的property 修改为
<property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
注意
其中<mapping assembly="NherbinateHelper"/>是后加的,原文件里没有。
这句话的意思是,映射我创建的那个类库。
我推断,Nherbinate是读这个配置文件,然后到这个程序集里,反射查询那些poco对象。
最后,nhibernate-configuration-2.2这句话我想了很久要不要改成4.0。
结果是我没改,测试一切正常。可以顺利使用。
结语
这是一场Nhibernate探索之旅,结果是非常顺利的配置成功了。共耗时2小时。
为什么说是探索之旅呢,因为,我也是首次配置Nhibernate,我平常更多的是使用Entity Framework。
文中使用了一些推断,猜测的词语。那是因为,真的是在推断的。我并不清楚那几个点的原理和含义,因为我没看Nhibernate的原代码。
虽然本文是讲述,配置Nhibernate;但我更想讲述的是,面对未知的框架入手学习和使用的方法。
我描述了自身一步一步配置Nhibernate的路径,我觉得还算高效,大家也可以效仿,用来学习陌生框架。
当然不必太追求速度,因为每个人的基础不一样。我比较熟悉Entity Framework。所以学习Nhibernate就会比较快。
如果你还没接触过ORM,那自然就会慢一点。
----------------------------------------------------------------------------------------------------
注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
若您觉得这篇文章还不错,请点击下方的【推荐】,非常感谢!

C#——Nhibernate探索的更多相关文章
- C#—Nhibernate使用教程
本篇文章,让我们一起来探索Nhibernate.首先我们去搜索Nhibernate下载地址,如下链接所示.该版本可能是最新版,我下载的4.0.4.GA.其中GA意思我没搞清楚.不过应该不重要.http ...
- [转]NHibernate之旅(11):探索多对多关系及其关联查询
本节内容 多对多关系引入 多对多映射关系 多对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 多对多关系引入 让我们再次回顾在第二篇中建立的数据模型 ...
- [转]NHibernate之旅(10):探索父子(一对多)关联查询
本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...
- [转]NHibernate之旅(9):探索父子关系(一对多关系)
本节内容 引入 NHibernate中的集合类型 建立父子关系 父子关联映射 结语 引入 通过前几篇文章的介绍,基本上了解了NHibernate,但是在NHibernate中映射关系是NHiberna ...
- [转]NHibernate之旅(6):探索NHibernate中的事务
本节内容 事务概述 1.新建对象 [测试成功提交] [测试失败回滚] 2.删除对象 3.更新对象 4.保存更新对象 结语 上一篇我们介绍了NHibernate中的Insert, Update, Del ...
- [转]NHibernate之旅(5):探索Insert, Update, Delete操作
本节内容 操作数据概述 1.新建对象 2.删除对象 3.更新对象 4.保存更新对象 结语 操作数据概述 我们常常所说的一个工作单元,通常是执行1个或多个操作,对这些操作要么提交要么放弃/回滚.想想使用 ...
- [转]NHibernate之旅(4):探索查询之条件查询(Criteria Query)
本节内容 NHibernate中的查询方法 条件查询(Criteria Query) 1.创建ICriteria实例 2.结果集限制 3.结果集排序 4.一些说明 根据示例查询(Query By Ex ...
- [转]NHibernate之旅(3):探索查询之NHibernate查询语言(HQL)
本节内容 NHibernate中的查询方法 NHibernate查询语言(HQL) 1.from子句 2.select子句 3.where子句 4.order by子句 5.group by子句 实例 ...
- NHibernate之旅(21):探索对象状态
本节内容 引入 对象状态 对象状态转换 结语 引入 在程序运行过程中使用对象的方式对数据库进行操作,这必然会产生一系列的持久化类的实例对象.这些对象可能是刚刚创建并准备存储的,也可能是从数据库中查询的 ...
随机推荐
- BZOJ_2764_[JLOI2011]基因补全_DP_高精度
BZOJ_2764_[JLOI2011]基因补全_DP_高精度 Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对 ...
- BZOJ_4867_[Ynoi2017]舌尖上的由乃_分块+dfs序
BZOJ_4867_[Ynoi2017]舌尖上的由乃_分块+dfs序 Description 由乃为了吃到最传统最纯净的美食,决定亲自开垦一片菜园.现有一片空地,由乃已经规划n个地点准备种上蔬菜.最新 ...
- Error【0003】:配置桥接网络报错
1.1 问题背景 在配置cosole宿主机的桥接网络环境时,在修改完/etc/sysconfig/ifcg-ethx和/etc/sysconfig/ifcg-brx后,执行service networ ...
- 从壹开始前后端 [vue后台] 之二 || 完美实现 JWT 滑动授权刷新
缘起 哈喽大家周一好!不知道小伙伴们有没有学习呀,近来发现各种俱乐部搞起来了,啥时候群里小伙伴也搞一次分享会吧,好歹也是半千了(时间真快,还记得5个月前只有20多人),之前在上个公司,虽然也参与组织过 ...
- 从壹开始前后端分离[.NetCore ] 38 ║自动初始化数据库(不定期更新)
缘起 哈喽大家好呀,我们又见面啦,这里先祝大家圣诞节快乐哟,昨天的红包不知道有没有小伙伴抢到呢.今天的这篇内容灰常简单,只是对我们的系统的数据库进行CodeFirst,然后就是数据处理,因为这几个月来 ...
- 将来会是Python、Java、Golang三足鼎立的局面吗?
甲:听说最近java跌落神坛,python称霸武林了,你知道吗? 乙:不是吧,我前几天看python怎么还是第三? 丙:你们都在扯蛋,python在2018年就已经是最好的语言了! 乙:不可能吧? 甲 ...
- javascript深入浅出图解作用域链和闭包
一.概要 对于闭包的定义(红宝书P178):闭包就是指有权访问另外一个函数的作用域中的变量的函数. 关键点: 1.闭包是一个函数 2.能够访问另外一个函数作用域中的变量 文章首发地址于sau交流学习社 ...
- 《前端之路》之 webpack 4.0+ 的应用构建
目录 一.版本 二.webpack 的主体概念 2-1.入口 2-1-1.单页面入口 2-1-2.多页面应用的入口 2-2.输出 2-3.loader 2-4.plugins 三.如何使用 3-1 关 ...
- 目前比较流行的Python量化开源框架汇总(交易+风险分析工具)
注:点击框架名称通往Github talib talib的简称是Technical Analysis Library,主要功能是计算行情数据的技术分析指标 numpy 介绍:一个用python实现的 ...
- Spring:(二)DI依赖注入方式
DI 依赖注入 DI(Dependency Injection)依赖注入,说简单一点就将类里面的属性在创建类的过程中给属性赋值,即将对象依赖属性(简单值,集合,对象)通过配置设值给该对象. 属性注入的 ...