C#——Nhibernate探索

小编 2026-06-25 阅读:1770 评论:0
 C#—Nhibernate探索本篇文章,让我们一起来探索Nhibernate。首先我们去搜索N...

 C#—Nhibernate探索

本篇文章,让我们一起来探索Nhibernate。

首先我们去搜索Nhibernate下载地址,如下链接所示。

该版本可能是最新版,我下载的4.0.4.GA。其中GA意思我没搞清楚。不过应该不重要。

https://sourceforge.net/projects/nhibernate/

分析文件内容

下载完成后,解压缩,我们看到文件夹内容如下图所示。

 C#——Nhibernate探索

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

打开Required文件夹,我们看到里面是这样的。

C#——Nhibernate探索

这里有两个类库;可以分析得出,这两个类库是要被引用的。

类库拥有对应的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.0XmlSchemas

因为是我用的是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文件夹下有如下文件。

 C#——Nhibernate探索

我推断,这里就是数据库连接字符串的模板。

由于我使用的数据库是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-20160718RXOSA;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,那自然就会慢一点。

 

----------------------------------------------------------------------------------------------------

注:此文章为原创,欢迎转载,请在文章页面明显位置给出此文链接!
若您觉得这篇文章还不错请点击下右下角的推荐,非常感谢!

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表