题外话: 中国的技术论坛要赶上stackoverflow的水平。至少还需35年。中国程序猿笔者的特点是:太浮躁,太easy下总结。太自得其乐,虽说写的是为了让别人更好的看。却也演变成了一种“你看,我懂这么多”的长篇申明——要的就是你不懂。这也似乎是中国没有有名的开源的原因。

当然了,依据马克思理论,经济基础决定上层建筑,这也是能够理解的,拿着那点工资,生活节奏那么快,压力那么大,写免费的文章。为别人答疑,显得有点奢侈。

我建议全部基础教程类的文章。须要做到下面二点:

【1】 给出执行环境,使用的工具列表,以及版本号(版本号非常重要)。(记得非常多工具都是WIN/UNIX都有版本号的,有些教程啥都不说。新人看到了云里雾里,拿着UNIX在WIN上測)。版本号就更加重要了。别说企业版元素,就是各种开源插件。控件,技术包,也都常常更新,多个文件,少个文件,多个配置,少个配置,都是非常正常,而恰恰这细微的变化是非常关键的,影响执行结果的。

【2】 给出最为简单的example,不要把自己公司測试的东西。或者手头的測试子项目原封不动的往上一贴,假设是基础教程,就要针对一种技术,做个最简单的样例,其它的衍生,交给读者自己去挖掘。一个example夹杂的其它代码越多,调试出错的可能性也就越大。非常大一批止于途中的读者都是如此。

就NHibernate和NServiceBus两个开源技术来说,NHibernate的官方教程简直就是简直的差。。。乱七八糟。相反NServiceBus可能初出茅庐。为了推广,所以基础教程做的很清晰,十分易懂。

-----------------------------------------------------------------------------------------切割线---------------------------------------------------------------------------------

就扯到这里,以上纯属个人意见,持保留态度。

以下正题:

【实例内容】把MySQL内的某个数据库里的某张表,使用NHibernate结合到.NET项目中。

【使用软件和版本号】 操作系统:WINDOWS 7.       开发IDE:VS 2010, C#   ,ORM工具:NHibernate 3.3GA。

数据库 MySQL 5

【有效期日】 2014/4/22日写,仅对NHibernate 3.3GA 有效,今后假设NHibernate升级,不能保证此文仍然有效。 此时网上的中文实例版本号,没有一个是靠谱的。

引用库列表:(这些库须要被分别应用到各个项目中)

要使用NHibernate 和MySQL相连。必需要用到下面几个库:

【1】NHibernate 提供的 .NET库文件以及 schema文件(共四个):Iesi.Collections.dll,NHibernate.dll,nhibernate-configuration.xsd 和 nhibernate-mapping.xsd

注意: 老版本号中还须要Castle的相关文件(致使我走了非常多弯路)。该版本号中是不须要的。还有说编译了会自己主动产生Castle。太扯淡了,我可没发现。

获得方式: 下载 NHibernate-3.3.3.GA-bin,在目录Required_Bins下。

【2】 MySQL 提供的ADO.NET库文件: MySql.Data.dll,须要注意的是。默认.NET框架中不支持MySQl,须要安装mysql-connector-net-6.2.4.zip中的mysql.data.msi,然后找到 MySql.Data.dll,这样有效。


我把上面这些文件都放在了 D:\NetDLL\ 下。

主要步骤:

【1】 在MySQL中创建一个数据库nhibernatesample,再创建一个表product。创建下面几个字段:(能够使用GUI软件来操作,我使用的是MySQL-Fron)

  1. Id int(11) Primary Key
  2. Name varchar(50)
  3. Category varchar(50)

第一个步骤也叫做创建R(关系数据库)

【2】 在VS中创建一个Class Library 项目TestNH,创建一个Product.cs类用于相应上个步骤中数据库表product,详细类代码为:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using NHibernate.Cfg;
  6. using NHibernate;
  7. using TestNH;
  8. using MySql.Data.MySqlClient;
  9.  
  10. namespace TestNH
  11. {
  12. public class Product
  13. {
  14. public virtual int Id { get; set; }
  15. public virtual string Name { get; set; }
  16. public virtual string Category { get; set; }
  17. }
  18. }

注意,全部字段必须申明为virtual,这是规定。为什么这样规定的原因比較复杂,这里不解释。

第二个步骤也叫做创建 O (内存对象Object)

【3】 在项目TestNH下创建与对象类相关的映射文件Product.hbm.xml

文件名称命名格式是: 类名.hbm.xml。

本例中文件内容为:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
  3. assembly="TestNH"
  4. namespace="TestNH">
  5.  
  6. <!-- more mapping info here -->
  7. <class name="Product" table="product">
  8. <id name="Id" column="Id">
  9. <generator class="assigned" />
  10. </id>
  11. <property name="Name" column="Name" type="String" length="50" />
  12. <property name="Category" column="Category" type="String" length="50" />
  13. </class>
  14. </hibernate-mapping>

注意,这个文件创建号后默认是content文件。为了让它在编译时被读取。要把它的属性中的Build Action 设置为 Embedded Resource。

【可选】双击这个文件名称,把schemas属性设置为:“D:\NetDLL\nhibernate-mapping.xsd” 。注意前面的文件夹名依据自己的存放位置自行改动。(PS,我没有设置,执行也能成功)。各个帖子都这么说,我先不妄下结论。

上述配置中,TestNH 是项目名。assembly在C#编程范畴里一般就是指一个项目project。以下的字段一看就懂,不解释了。

第三个步骤是创建M(Mapping文件)。上述三个就完毕了 ORM 三个元素的创建。以下要做的就是让他们整合起来。编译到我们的项目里。

【4】编写整合配置文件hibernate.cfg.xml,这里有三种方式:类.cs方式。程序配置app.config方式,以及NHibernate配置文件hibernate.cfg.xml方式。

这里我们使用最后一种。也是最为建议的一种。

在TestNH下创建该文件,文件内容为:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2.  
  3. <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  4. <session-factory>
  5. <property name="hbm2ddl.keywords">none</property>
  6. <property name="connection.provider">
  7. NHibernate.Connection.DriverConnectionProvider
  8. </property>
  9. <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
  10. <property name="query.substitutions">hqlFunction=SQLFUNC</property>
  11. <property name="connection.driver_class">
  12. NHibernate.Driver.MySqlDataDriver
  13. </property>
  14. <property name="connection.connection_string">
  15. Data Source=localhost;Database=nhibernatesample;User Id=root;Password=123456
  16. </property>
  17. <property name="show_sql">false</property>
  18. <mapping assembly="TestNH" />
  19. </session-factory>
  20. </hibernate-configuration>

当中

  1. <property name="hbm2ddl.keywords">none</property>

这句话很重要,不然最后会把“ReservedWords does not belong to ...” 错误。其它字段字面翻译。

注意connection_string 里须要换成自己的配置。

注意,这个文件的文件属性中的copy to output directory 属性。设置为 copy always。另外,这是告诉程序,每次都要更新这个文件,防止这个文件改了,公布的时候使用的还是老的配置文件。不仅如此,有时候也不能全信VS2010,过程中假设改动了配置文件,最好是clean 后又一次编译执行。

【可选】最好也双击这个文件名称。把schemas属性设置为:“D:\NetDLL\nhibernate-configuration.xsd” ,注意前面的文件夹名依据自己的存放位置自行改动(PS,我没有设置,执行也能成功)。

各个帖子都这么说。我先不妄下结论。

【5】编写測试project,

随便加入个windows application project。如TestCase,别忘了引用上面提到的那些库文件,然后加入个button,button事件代码为:(贴上整个类的代码)

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using TestNH;
  10. using MySql.Data.MySqlClient;
  11. using NHibernate;
  12. using NHibernate.Cfg;
  13. using NHibernate.Dialect;
  14. using NHibernate.Driver;
  15. using NHibernate.Mapping.ByCode;
  16.  
  17. namespace TestCase
  18. {
  19. public partial class Form1 : Form
  20. {
  21. public Form1()
  22. {
  23. InitializeComponent();
  24.  
  25. }
  26.  
  27. private void button1_Click(object sender, EventArgs e)
  28. {
  29. Configuration cfg = new Configuration().Configure("hibernate.cfg.xml");
  30. ISessionFactory factory = cfg.BuildSessionFactory();
  31. ISession session = factory.OpenSession();
  32. ITransaction transaction = session.BeginTransaction();
  33. Product newUser = new Product();
  34. newUser.Id = 3;
  35. newUser.Name = "Joseph Cool";
  36. newUser.Category = "abc123";
  37.  
  38. // Tell NHibernate that this object should be saved
  39. session.Save(newUser);
  40.  
  41. // commit all of the changes to the DB and close the ISession
  42. transaction.Commit();
  43. session.Close();
  44.  
  45. MessageBox.Show("OK!");
  46. }
  47. }
  48. }

这里的调用方式是:

  1. Configuration cfg = new Configuration().Configure("hibernate.cfg.xml");

网上的各种奇葩调用方式非常多(经測试。问题非常多)。这里调用方式我没測试,可是肯定能够用于3.3GA版本号。

这句话是告诉编译器。我将使用这个配置文件。

网上的写法是:

  1. Configuration cfg = new Configuration();

说是这样也会自己主动寻找这个文件,尽管我没測试成功。

并且这样的写法也十分的不友好。

F5 执行程序把,不会有错了。

[NHibernate] 入门实例 NHibernate 3.3 GA + VS2010 +MySQL的更多相关文章

  1. Nhibernate系列学习之(一) ORM and Nhibernate入门实例解析

    最近框架项目需要,数据层想使用Nhibernate,代替传统的sql语句的写法,更加使用面向对象的思维来维护实体与数据库的这层关系映射(ORM),好在之前接触过Java时学习使用了Hibernate, ...

  2. Linq to NHibernate入门示例

    Linq to NHibernate入门示例 NHibernate相关: 09-08-25连贯NHibernate正式发布1.0候选版 09-08-17NHibernate中一对一关联的延迟加载 09 ...

  3. Nhibernate入门与demo

    学习和使用Nhibernate已经很久了,一直想写点东西和大家一起学习使用Nhibernate.博客园里也有很多大牛写了很多关于Nhibernate入门的文章.其中:李永京的博客http://www. ...

  4. nhibernate入门使用经验

    最近项目中用到nhibernate,学到了一点.就在这里写一点. nhibernate是java世界的hibernate的.net版本,其工作原理和hibernate一样的.我们需要用hbm的文件来描 ...

  5. NHibernate考察实例:简单映射

    建立一个Company类用来测试,对应的表为TBLCOMPANY.   1. 下载NHibernate(版本1.2.0.CR1),将NHibernate \bin\net-2.0下面的文件拷贝到lib ...

  6. Nhibernate入门篇连接Sqlserver的增删查改

    第一步:创建数据库 create table Emp( EmpId int primary key identity, EmpName ), EmpDate date ) 第二步:去官网下载:http ...

  7. [NHibernate]缓存(NHibernate.Caches)

    系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) [NHibernate ...

  8. [NHibernate]第一个NHibernate的应用配置

    NHibernate是.Net平台下一个成熟的,开源的对象关系映射器(ORM).本文来介绍第一次使用NHibernate的时候的配置. 1.下载NHibernate.Nhibernate官网最新版本为 ...

  9. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

随机推荐

  1. HDU_3182_Hamburger Magi_状态压缩dp

    Hamburger Magi Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. 安卓app测试之Monkeyrunner

    一.MonkeyRunner简介 MonkeyRunner提供了系列的API ,MonkeyRunner可以完成模拟事件及截图操作 ,分为以下三类: MonkeyRunner:用来连接设备或模拟器的 ...

  3. python3.7实现九九乘法表

    for i in range(1,10): for j in range(1,i+1): print("%d*%d=%d" % (i,j,i*j),end=" " ...

  4. 行内块+calc+margin 三列布局

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. Ztree加载完成默认选中根节点右侧生成表格

    需求:页面加载完成之后,默认选中ztree的根节点,并执行其点击方法,右侧生成表格: 效果:如下图所示: 思路:在节点点击事件clickNode方法中根据节点的部门code查询这个部门下的所有员工,并 ...

  6. SQLAlchemy-Utils

    由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法. 安装: pip3 install sqlalchemy_utils 示例: f ...

  7. java mysql prepareStatement模糊查询like使用注意

    今天在使用mysql 的like语句是,发现prepareStatement的like语句和一般的=写法有一样. 当要使用prepareStatement的like查询时,按照一般写法,都会写成: S ...

  8. Django-Rest framework中文翻译-Request

    REST framework的Request类扩展自标准的HttpRequest,增加了REST framework灵活的请求解析和请求验证支持. 请求解析 REST framework的Reques ...

  9. JavaSE 学习笔记之包装类(十七)

    基本数据类型对象包装类:是按照面向对象思想将基本数据类型封装成了对象. 好处: 1:可以通过对象中的属性和行为操作基本数据. 2:可以实现基本数据类型和字符串之间的转换. 关键字   对应的类名 by ...

  10. HDU 5493 Queue

    Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...