[NHibernate] 入门实例 NHibernate 3.3 GA + VS2010 +MySQL

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

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


我建议所有基础教程类的文章,需要做到以下二点:

【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)

Id int(11) Primary Key
Name varchar(50)
Category varchar(50)

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


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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NHibernate.Cfg;
using NHibernate;
using TestNH;
using MySql.Data.MySqlClient;

namespace TestNH
{
    public class Product
    {
        public virtual int Id { get; set; }
        public virtual string Name { get; set; }
        public virtual string Category { get; set; }
    }
}
注意,所有字段必须申明为virtual,这是规定,为什么这样规定的原因比较复杂,这里不解释。
第二个步骤也叫做创建 O (内存对象Object)


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

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

本例中文件内容为:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="TestNH"
                   namespace="TestNH">

  <!-- more mapping info here -->
  <class name="Product" table="product">
    <id name="Id" column="Id">
      <generator class="assigned" />
    </id>
    <property name="Name" column="Name" type="String" length="50" />
    <property name="Category" column="Category"  type="String" length="50" />
  </class>
</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下创建该文件,文件内容为:

<?xml version="1.0" encoding="utf-8" ?>

  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="hbm2ddl.keywords">none</property>
      <property name="connection.provider">
        NHibernate.Connection.DriverConnectionProvider
      </property>
      <property name="dialect">NHibernate.Dialect.MySQL5Dialect</property>
      <property name="query.substitutions">hqlFunction=SQLFUNC</property>
      <property name="connection.driver_class">
        NHibernate.Driver.MySqlDataDriver
      </property>
      <property name="connection.connection_string">
        Data Source=localhost;Database=nhibernatesample;User Id=root;Password=123456
      </property>
      <property name="show_sql">false</property>
      <mapping assembly="TestNH" />
    </session-factory>
  </hibernate-configuration>
其中
<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,别忘了引用上面提到的那些库文件,然后添加个按钮,按钮事件代码为:(贴上整个类的代码)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using TestNH;
using MySql.Data.MySqlClient;
using NHibernate;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernate.Mapping.ByCode;

namespace TestCase
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Configuration cfg = new Configuration().Configure("hibernate.cfg.xml");
            ISessionFactory factory = cfg.BuildSessionFactory();
            ISession session = factory.OpenSession();
            ITransaction transaction = session.BeginTransaction();
            Product newUser = new Product();
            newUser.Id = 3;
            newUser.Name = "Joseph Cool";
            newUser.Category = "abc123";

            // Tell NHibernate that this object should be saved
            session.Save(newUser);

            // commit all of the changes to the DB and close the ISession
            transaction.Commit();
            session.Close();

            MessageBox.Show("OK!");
        }
    }
}

这里的调用方式是:

 Configuration cfg = new Configuration().Configure("hibernate.cfg.xml");
网上的各种奇葩调用方式很多(经测试,问题很多),这里调用方式我没测试,但是肯定可以用于3.3GA版本。

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

网上的写法是:

 Configuration cfg = new Configuration();

说是这样也会自动寻找这个文件,虽然我没测试成功。 而且这种写法也十分的不友好。


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






[NHibernate] 入门实例 NHibernate 3.3 GA + VS2010 +MySQL,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。