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,那自然就会慢一点。
----------------------------------------------------------------------------------------------------
注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
面试 9:Java 玩转冒泡排序
面试 9:用 Java 实现冒泡排序 南尘的朋友们,新的一周好,原本打算继续讲链表考点算法的,这里姑且是卡一段。虽然在我们 Android 开发中,很少涉及到排序算法,因为基本官方都帮我们封装好了,但排序算法也是非常重要的,在面试中 归并排序 和 快速排序 一直为高频考点,但在学习它们之前,我们必须得先把三大基础算法学会,毕竟层层递进,方得始终嘛。 冒泡排序 冒泡排序恐怕是我们计算机专业课程上以第一个接触到的排序算法,也算是一种入门级的排序算法。它的基本思想是:两两比较相邻记录的关键字,如何反序则交换,直到没有反序的记录为止。 冒泡排序算法原理: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。 一次比较过程如图所示: 图片来源于网络 我们通常容易想到最简单的实现代码: public class Test09 { private static void swap(in...
- 下一篇
让Python之父愤然退位的PEP572究竟是什么?
【新智元导读】在星期四的一份名为“权力转移”的邮件列表帖子中,Python之父Guido van Rossum写道:“现在PEP 572已经完成,我不再想为一个PEP这么努力争取,而且还发现有这么多人鄙视我的决定。” 他现在已经宣布卸任,并且明确表示不会任命继任者。 Python之父Guido van Rossum表示,他累了。 Guido van Rossum—他在1989年创建了Python编程语言,被戏称为“仁慈的生活独裁者”(benevolent dictator for life),并将Python语言推广到全球,现在已经宣布卸任,并且明确表示不会任命继任者。 这位“仁慈的生活独裁者”穿着“人生苦短,我用Python”T恤 “我累了,需要很长时间的休息” 在星期四的一份名为“权力转移”的邮件列表帖子中,Guido van Ross
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS关闭SELinux安全模块
- CentOS7,CentOS8安装Elasticsearch6.8.6