题外话: 中国的技术论坛要赶上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)

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,别忘了引用上面提到的那些库文件,然后加入个button,button事件代码为:(贴上整个类的代码)

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的更多相关文章

  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_1143_tri tiling

    Tri Tiling Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  2. C# 字符串每隔两个 提取

    private void button3_Click(object sender, EventArgs e) { StringBuilder sb = new StringBuilder(); str ...

  3. 并发编程学习笔记(5)----AbstractQueuedSynchronizer(AQS)原理及使用

    (一)什么是AQS? 阅读java文档可以知道,AbstractQueuedSynchronizer是实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量.事件,等等)提供一个框架, ...

  4. uploadify的简单使用

    简单的图片上传: 1.进入官网下载uploadify插件:http://www.uploadify.com/download/ 2.导入uploadify插件提供的css样式和类库: <link ...

  5. python爬虫27 | 当Python遇到MongoDB的时候,存储av女优的数据变得如此顺滑爽~

    上次 我们知道了怎么操作 MySQL 数据库 python爬虫26 | 把数据爬取下来之后就存储到你的MySQL数据库. MySQL 有些年头了 开源又成熟又牛逼 所以现在很多企业都在使用 MySQL ...

  6. PAT 1131 Subway Map

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  7. iframe 与frameset

    frameset 元素可定义一个框架集.它被用来组织多个窗口(框架).每个框架存有独立的文档.在其最简单的应用中,frameset 元素仅仅会规定在框架集中存在多少列或多少行.您必须使用 cols 或 ...

  8. [NOI2000] 单词查找树

    ★★   输入文件:trie.in   输出文件:trie.out   简单对比 时间限制:1 s   内存限制:128 MB 在进行文法分析的时候,通常需要检测一个单词是否在我们的单词列表里.为了提 ...

  9. POJ——1061 青蛙的约会

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 117858   Accepted: 24599 Descript ...

  10. Java使用JNI调用DLL库

    JNI是Java自带的方法,不需要引入第三方jar包,优点是因为是java自带的方法,兼容性较好,缺点就是代码书写繁琐 新建Java项目Test --> 新建测试类TestNative,声明本地 ...