zoukankan      html  css  js  c++  java
  • 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.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文件夹下有如下文件。

     

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

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

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

    注:此文章为原创,任何形式的转载都请联系作者获得授权并注明出处!
    若您觉得这篇文章还不错,请点击下方的推荐】,非常感谢!

     

  • 相关阅读:
    让Lua支持Linq吧
    游戏提高性能 游戏降帧处理
    Lua BehaviourTree 各节点说明
    AssetsManagerEx 组件使用说明
    CocosStudio文件解析工具CsdAnalysis
    Cocos2dx实现光影效果的两种方式
    C++ 版本的 行为树的简单实现
    Buff系统设计
    SetZOrder 无效
    CClayer ignoreAnchorPointForPosition 参数的作用
  • 原文地址:https://www.cnblogs.com/kiba/p/9310967.html
Copyright © 2011-2022 走看看