转载于http://abluedog.cnblogs.com/archive/2006/04/15/375862.html

基本的软件环境如下:
1.NHibernate http://www.nhibernate.org/ 
2.Code Smith http://www.codesmithtools.com/
3.NHibernate模板 点击这里下载
当然,少不了VS2005跟SQLServer了,我这里用的是SQLServer2005,教程用在SQLServer2000上应该没有问题,默认情况下,我将建立并使用一个叫NHibernate的数据库。

首先,我们先建立一个最简单的Person表,如下完整脚本(你可以进行修改以适合自己的数据库):

USE [NHibernate]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Person](
    [id] [
int] IDENTITY(1,1) NOT NULL,
    [name] [varchar](
50) COLLATE Chinese_PRC_CI_AS NOT NULL,
 CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (IGNORE_DUP_KEY
=OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

仅有两个字段,一个自动增长的id,一个name,如下:

 
然后将下载的nhibernate-template解压,打开Code Smith,将模板加入”Template Explorer”,如下:

 
然后在其中的NHibernate.cst上点右键,选择“Execute”,弹出设置窗口,在左边的属性窗口进行如下设置:

 
注意:SourceDatabase属性在第一次选择时需要配置一个连接字符串,配置好后Code Smith将记录下来。 Assembly属性代表的是生成文件的默认Assembly名,而NameSpace,顾名思义,就是使用的命名空间了,这里我们全部使用”Test.Model”,请记住这个名字,点击左下角的Generate,将会在指定的输出目录下产生两个文件:Person.cs,Person.hbm.xml。

好了,NHibernate需要的类文件和映射文件生成完了,我们可以开始干活了!(生成NHibernate文件均是如此步骤,以后不再赘述)

新建立一个类库工程,为了简洁起见,我们命名为Model,需要注意的是,为了跟刚才生成的文件对应,我们需要在Model工程的属性页中将起Assembly名字设为上面的“Test.Model”,如下:

 
然后将刚才生成的两个文件Person.cs和Person.hbm.xml加入到Model工程中来,选中Person.hbm.xml文件,在属性窗口中将其“Build Action”设置为“Embedded Resource”(这是非常重要的一步,否则NHibernate将无法找到映射文件),如下:
 

build,ok,通过。

然后建立一个控制台工程,命名为Console1,添加NHibernate和上面Model项目的引用,另外添加一个应用程序配置文件,如下:

<?xml version="1.0" encoding="utf-8"?><configuration><configSections><sectionname="nhibernate"type="System.Configuration.NameValueSectionHandler, System,
                    Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"
/></configSections>
<nhibernate><addkey="hibernate.connection.provider"value="NHibernate.Connection.DriverConnectionProvider"/><addkey="hibernate.connection.driver_class"value="NHibernate.Driver.SqlClientDriver"/><addkey="hibernate.connection.connection_string"value="Server=localhost;Initial Catalog=NHibernate;Integrated Security=SSPI"/><addkey="hibernate.connection.isolation"value="ReadCommitted"/><addkey="hibernate.dialect"value="NHibernate.Dialect.MsSql2000Dialect"/></nhibernate>
</configuration>

请注意这里,这是引入NHibernate1.0的配置文件.如下引用是NHibernate2.0应该用如下配置

NHibernate2.0配置如下:

<configuration><!--Add this element--><configSections><sectionname="hibernate-configuration"type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/></configSections><!--Add this element--><hibernate-configurationxmlns="urn:nhibernate-configuration-2.2"><session-factory><propertyname="dialect">NHibernate.Dialect.MsSql2000Dialect</property><propertyname="connection.provider">NHibernate.Connection.DriverConnectionProvider</property><propertyname="connection.connection_string">Server=BOCO-Terry\DATA;initial catalog=NHibernate;Integrated Security=true</property></session-factory></hibernate-configuration><!--Leave the system.web section unchanged--><system.web></system.web></configuration>

然后编写如下代码:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingNHibernate;
usingNHibernate.Cfg;
usingTest.Model;

namespaceConsole1
{
classProgram
{
staticvoidMain(string[] args)
{
            Configuration config
=newConfiguration().AddAssembly("Test.Model");
            ISessionFactory factory
=config.BuildSessionFactory();
            ISession session
=factory.OpenSession();

            Person person
=newPerson();
            person.Name
="Jackie Chan";

            ITransaction trans
=session.BeginTransaction();
try{
                session.Save(person);
                trans.Commit();
                Console.WriteLine(
"Insert Success!");
            }
catch(Exception ex)
{
                trans.Rollback();
                Console.WriteLine(ex.Message);
            }
        }
    }
}

运行,ok,执行成功!!
我们到数据库检查一下,如下:

 
我们想要添加的记录已经成功加入到数据库中!!
是不是感觉有些神奇啊?好,我们开始详细解释。
先来看生成的两个文件,第一个是Person.cs,如下:

usingSystem;
usingSystem.Collections;

namespaceTest.Model
{
Person#regionPerson
/**////<summary>///Person object for NHibernate mapped table 'Person'.
///</summary>

publicclassPerson
{
Member Variables#regionMember Variables        
protectedint_id;
protectedstring_name;

#endregion

Constructors#regionConstructors
publicPerson(){ }
publicPerson(stringname )
{
this._name=name;
        }

#endregion

Public Properties#regionPublic Properties
publicintId
{
get{return_id;}set{_id=value;}        }

publicstringName
{
get{return_name; }set{
if( value!=null&&value.Length>50)
thrownewArgumentOutOfRangeException("Invalid value for Name", value, value.ToString());
                _name
=value;
            }
        }

        

#endregion
    }
#endregion
}

你可以发现,这完全是一个普通的poco类(Plain Old CLR Object),仅仅是对数据库person表的一个完全映射,不依赖于任何框架,可以用来作为持久化类,你可以在任何地方使用而不用担心依赖于某些神秘的运行时东西。

另外,NHibernate需要知道怎样去加载(load)和存储(store)持久化类的对象。这正是NHibernate映射文件发挥作用的地方。映射文件告诉NHibernate它应该访问数据库(database)里面的哪个表(table)及应该使用表里面的哪些字段(column),这就是我们今天要讲的重点了,Person.hbm.xml,如下:

<?xml version="1.0" encoding="utf-8"?><hibernate-mappingxmlns="urn:nhibernate-mapping-2.0"><classname="Test.Model.Person, Test.Model"table="Person"><idname="Id"type="Int32"unsaved-value="0"><columnname="id"sql-type="int"not-null="true"unique="true"index="PK_Person"/><generatorclass="native"/></id><propertyname="Name"type="String"><columnname="name"length="50"sql-type="varchar"not-null="true"/></property></class></hibernate-mapping>

不用说,最顶层的hibernate-mapping节点是NHibernate用来进行映射的根了,其中,包含一个class节点,里面的name属性对应我们的Person类,注意,需要完整的限定名;而table属性,则显而易见是对应数据库中的Person表了。
我们再往里面看,分别有两个节点,一个是id,对应数据库中的id,一个是属性name,对应表中的column name和Person类中的name属性,整个映射文件简捷明了,一看即知。实际上这是由代码产生工具产生的映射文件,里面很多东西我们其实可以省略,如下写法:
<property name=”Name” column=”name” />
NHibernate将自动去匹配数据库中的列而不需要我们来设置。

下面,我们来看一下应用程序配置文件中都记录了那些东西,如下:
hibernate.connection.provider_class  
定制IConnectionProvider的类型.
例如:full.classname.of.ConnectionProvider (如果提供者创建在NHibernate中), 或者 full.classname.of.ConnectionProvider, assembly (如果使用一个自定义的IConnectionProvider接口的实现,它不属于NHibernate)。
 
hibernate.connection.driver_class  
定制IDriver的类型.
full.classname.of.Driver (如果驱动类创建在NHibernate中), 或者 full.classname.of.Driver, assembly (如果使用一个自定义IDriver接口的实现,它不属于NHibernate)。

hibernate.connection.connection_string  
用来获得连接的连接字符串.

hibernate.connection.isolation  
设置事务隔离级别. 请检查 System.Data.IsolationLevel 来得到取值的具体意义并且查看数据库文档以确保级别是被支持的。
例如: Chaos, ReadCommitted, ReadUncommitted, RepeatableRead, Serializable, Unspecified

hibernate.dialect 
NHibernate方言(Dialect)的类名 - 可以让NHibernate使用某些特定的数据库平台的特性
例如: full.classname.of.Dialect(如果方言创建在NHibernate中), 或者full.classname.of.Dialect, assembly (如果使用一个自定义的方言的实现,它不属于NHibernate)。

接着,我们开始解释代码的执行,如下:

Configuration config=newConfiguration().AddAssembly("Test.Model");

//通过配置对象来产生一个SessionFactory对象,这是一个Session工厂,
//那么Session是用来干什么的呢?一个Session就是由NHibernate封装
//的工作单元,我们可以近似地认为它起到ADO.Net中Connection的作用。ISessionFactory factory=config.BuildSessionFactory();
ISession session
=factory.OpenSession();

Person person
=newPerson();
person.Name
="Jackie Chan";

//这里,开启一个由NHibernate封装的事务,当然,在这里最终代表
//的还是一个真实的数据库事务,但是我们已经不需要再区分到底是
//一个SqlTransaction还是一个ODBCTransaction了ITransaction trans=session.BeginTransaction();
try{
//保存,提交,就这么简单!!session.Save(person);
        trans.Commit();
        Console.WriteLine(
"Insert Success!");
}
catch(Exception ex)
{
        trans.Rollback();
        Console.WriteLine(ex.Message);
}

NHibernate Step by Step (一) 转载相关推荐

  1. NHibernate Step by Step:序篇 (转)

    原文出处:http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html 原文作者:abluedog 很久以前,你可能习惯了connect ...

  2. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...

  3. python写一个通讯录step by step V3.0

    python写一个通讯录step by step V3.0 更新功能: 数据库进行数据存入和读取操作 字典配合函数调用实现switch功能 其他:函数.字典.模块调用 注意问题: 1.更优美的格式化输 ...

  4. C#2.0实例程序STEP BY STEP--实例二:数据类型

    C#2.0实例程序STEP BY STEP--实例二:数据类型 与其他.NET语言一样,C#支持Common Type Sysem(CTS),其中的数据类型集合不仅包含我们熟悉的基本类型,例如int, ...

  5. 文本分类step by step(二)

    (注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...

  6. 数据库设计Step by Step (9)——ER-to-SQL转化

    2019独角兽企业重金招聘Python工程师标准>>> 引言:前文(数据库设计 Step by Step (8)--视图集成)讨论了如何把局部ER图集成为全局ER图.有了全局ER图后 ...

  7. Python 调试:step into/step out/step over 的区别

    Python 调试:step into/step out/step over 的区别: 首先在PyCharm 程序中设置 " 断点 ",后点击右上角的Debug 按钮进入调试程序状 ...

  8. Step by Step Setup Git Server on Windows with CopSSH + msysGit and Integrate Git with Visual Studio

    Introduction First of all, let me clarify that Git doesn't need to specify the side for client and s ...

  9. Enterprise Library Step By Step系列(一):配置应用程序块——入门篇

    写在前面: 最近准备写Enterprise Library Step By Step的系列文章,对于每一个应用程序块,我都会用入门篇,进阶篇,剖析篇三篇文章去写. 在入门篇里会详细介绍应用程序块的使用 ...

  10. Microsoft Visual C# 2008 Step by Step

    Microsoft Visual C# 2008 Step by Step 转载于:https://www.cnblogs.com/gavinhughhu/archive/2010/01/22/165 ...

最新文章

  1. opencv-contrib配置过程
  2. MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八
  3. idea 创建 简单的scala maven项目
  4. typescript 怎么表示当前时间减一个月_TypeScript 入门知识点总结
  5. HDU - 5017 Ellipsoid(三分套三分/模拟退火)
  6. C#设计模式之2-抽象工厂模式
  7. 首批吃螃蟹!35 所高校获批开设「人工智能」本科专业
  8. java.servlet不存在_eclipse提示servlet不存在 的解决办法
  9. 微课|玩转Python轻松过二级:第3章课后习题解答3
  10. 蚂蚁金服做区块链:我们绝不发空气币,要做就服务民生!
  11. Linux 命令(31)—— find 命令
  12. pscc2019滤镜抽出_「PS-CC2019新版教程」魔棒工具,让你一秒钟完成抠图-基础篇
  13. java String字符串去除()里的内容
  14. 基于Python的发票识别与机器学习(保姆式教程)
  15. 《我想吃掉你的胰脏》观后感
  16. 超强大在线词频统计功能,从一篇文章到一个G的文本均可轻松统计
  17. 永久免费的英文字体生成软件,例:
  18. matlab图像处理常用函数大全
  19. 1008.顺序结构习题:摄氏温度转换为华氏温度和绝对温度
  20. MW150UH驱动程序Linux,水星MW150UH无线网卡驱动程序

热门文章

  1. 【AI初识境】给深度学习新手开始项目时的10条建议
  2. 【模型解读】深度学习网络之Siamese Network网络
  3. android布局的属性大全,Android布局属性大全
  4. java 动态编译 canino_java动态编译
  5. openresty开发系列21--lua的模块
  6. DBUtils (30)
  7. Jenkins部署:The username and password you provided are not correct (error 401)
  8. Docker logs 命令
  9. php 表单校验函数库(判断email格式是否正确、http地址是否合法有效、手机号码是否合法)...
  10. 虚拟机中的solaris无法通过putty连接(网络模式为桥接模式)