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是要放到c盘的,路径如下:

C:\Program Files (x86)\Microsoft Visual Studio 11.0\Xml\Schemas

因为是我用的是vs2012,所以,我找的路径是Microsoft Visual Studio 11.0。

我上网上调查了下这两个文件是做什么用的。调查结果是,这俩货是【文件智能提示功能】用的。

上网调查后,发现Nhibernate有Castle框架、LinFu框架、Spring.Net三种。

看起来很复杂,不过先不去管那么多,先直接引用类库。

 

然后我建立了一个类库程序,引用Iesi.Collections.dll和NHibernate.dll两个DLL。

 

接下来,我们开始建立持久化对象。

  1. public class Test
  2.  
  3. {
  4.  
  5. public virtual int Id { get; set; }
  6.  
  7. public virtual string Name { get; set; }
  8.  
  9. }

  

对象与数据库的映射是保存在XML文件中的,我们配置XML映射文件如下。

该XML文件的属性,要求设置其生成操作为【嵌入的资源】。

此外,我怕它丢失,还给他设置了始终复制的属性。

XML文件如下:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  
  3. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  4.  
  5. assembly="NherbinateHelper"
  6.  
  7. namespace="NherbinateHelper">
  8.  
  9.  
  10. <class name ="Test">
  11.  
  12. <id name="Id" column ="Id">
  13.  
  14. <generator class ="native"/>
  15.  
  16. </id>
  17.  
  18. <property name ="Name"/>
  19.  
  20.  
  21. </class>
  22.  
  23. </hibernate-mapping>

  

再然后,我们建立数据库连接的类。

因为我们没有显示设置数据库连接字符串,所以,我猜测这个类,会读配置文件中SQL字符串连接。

 

  1. public class NHibernateHelper
  2.  
  3. {
  4.  
  5. private ISessionFactory _sessionFactory;
  6.  
  7. public NHibernateHelper()
  8.  
  9. {
  10.  
  11. _sessionFactory = GetSessionFactory();
  12.  
  13. }
  14.  
  15. private ISessionFactory GetSessionFactory()
  16.  
  17. {
  18.  
  19. return (new Configuration()).Configure().BuildSessionFactory();
  20.  
  21. }
  22.  
  23. public ISession GetSession()
  24.  
  25. {
  26.  
  27. return _sessionFactory.OpenSession();
  28.  
  29. }
  30.  
  31. }

  

然后,我们建立domain(域),添加增删改查的方法。

  1. public class NHibernateSample
  2.  
  3. {
  4.  
  5. protected ISession Session { get; set; }
  6.  
  7. public NHibernateSample(ISession session)
  8.  
  9. {
  10.  
  11. Session = session;
  12.  
  13. }
  14.  
  15.  
  16. public void CreateCustomer(Test test)
  17.  
  18. {
  19.  
  20. Session.Save(test);
  21.  
  22. Session.Flush();
  23.  
  24. }
  25.  
  26. public Test GetCustomerById(int Id)
  27.  
  28. {
  29.  
  30. return Session.Get<Test>(Id);
  31.  
  32. }
  33.  
  34. }

  

然后,我们新建一个控制台程序,用来调用这个类库测试。

测试类代码如下。

  1. public class NHibernateSampleFixture
  2.  
  3. {
  4.  
  5. private NHibernateSample _sample;
  6.  
  7.  
  8. public NHibernateSampleFixture()
  9.  
  10. {
  11.  
  12. _sample = new NHibernateSample(new NHibernateHelper().GetSession());
  13.  
  14. }
  15.  
  16.  
  17. public void GetCustomerByIdTest()
  18.  
  19. {
  20.  
  21. var tempCutomer = new Test { Name = "李" };
  22.  
  23. _sample.CreateCustomer(tempCutomer);
  24.  
  25. Test customer = _sample.GetCustomerById(1);
  26.  
  27. int customerId = customer.Id;
  28.  
  29.  
  30. }
  31.  
  32. }

  

调用如下:

  1. class Program
  2.  
  3. {
  4.  
  5. static void Main(string[] args)
  6.  
  7. {
  8.  
  9. NHibernateSampleFixture f = new NHibernateSampleFixture();
  10.  
  11. f.GetCustomerByIdTest();
  12.  
  13. }
  14.  
  15. }

测试结果是失败,因为缺少配置数据库连接的文件。

现在我们打开文件夹Configuration_Templates,发现Configuration_Templates文件夹下有如下文件。

 

我使用的数据库是sqlserver,所以,我复制了mssql.cfg.xml。

然后将复制的文件,黏贴到测试的控制台程序下,然后改名为《hibernate.cfg.xml》。

这里测试了下,貌似不改名不好使,配置文件内容如下

【PS:我始终没搞懂,XML中的CFG代表什么意思。】

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3.  
  4. <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
  5.  
  6. <session-factory name="NHibernate.Test">
  7.  
  8. <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
  9.  
  10. <property name="connection.connection_string">
  11.  
  12. Server=SKY-20160718RXO\SA;initial catalog=Nherbinate;Integrated Security=SSPI;
  13.  
  14. </property>
  15.  
  16. <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
  17.  
  18. <mapping assembly="NherbinateHelper"/>
  19.  
  20. </session-factory>
  21.  
  22. </hibernate-configuration>

我连接的是sqlserver2012,所以配置文件里,我有做修改,修改驱动为NHibernate.Dialect.MsSql2012Dialect。原始版是2008。

其中<mapping assembly=”NherbinateHelper”/>是后加的,原文件里没有。

这句话的意思是,映射我创建的那个类库。

我推断,Nherbinate是读这个配置文件,然后到这个程序集里,反射查询那些poco对象。

最后,nhibernate-configuration-2.2这句话我想了很久要不要改成4.0。

结果是我没改,测试一切正常。可以顺利使用。

 结语

这是一场Nhibernate探索之旅,结果是非常顺利的配置成功了。

版权声明:本文为kiba原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/kiba/p/9306668.html