原文出处;http://www.cnblogs.com/abluedog/archive/2006/04/15/375862.html
原文作者:abluedog
原文:http://shijie.blog.51cto.com/116032/268628
作者:shijiesj
在此二位的基础上,稍作个人修改。感谢二位。
由于项目需要,最近在学NHibernate,从abluedog与shijiesj处受益匪浅。尤其是shijiesj在以前的基础上作了最新的更改,现拿来学习之。
以前的版本都只能在 NHibernate 1.1版本的情况下才能运行,我下面提供了在1.1 版本与2.1.2版本下运行的详解。
源码下载地址:https://files.cnblogs.com/vihone/NHibernate实例源码.rar
基本的软件环境如下:
1.NHibernate:www.nhibernate.org 我下的是NHibernate-2.1.2.GA-bin.zip
2.Code Smith:http://www.codesmithtools.com/ 我用的是CodeSmith Professional v5.1.3.8510
3.NHibernate模板:点击这里下载
4. VS2008 +SQL2008 or VS2005 + SQL2005
操作步骤:
新建TestNHibernate数据库(库中包括Roles和Users表,其中Roles中的主键RoleId为Users表中的外键,一对多的关系)
1、Roles表:
USE [TestNHibernate]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Roles](
[RoleId] [int] IDENTITY(1,1) NOT NULL,
[RoleName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
CONSTRAINT [PK_Roles] PRIMARY KEY CLUSTERED
(
[RoleId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
2、Users表
USE [TestNHibernate]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Users](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[LastName] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL,
[Sex] [varchar](8) COLLATE Chinese_PRC_CI_AS NULL,
[Age] [int] NULL,
[RoleId] [int] NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Users] WITH CHECK ADD CONSTRAINT [FK_Users_Roles] FOREIGN KEY([RoleId])
REFERENCES [dbo].[Roles] ([RoleId])
GO
ALTER TABLE [dbo].[Users] CHECK CONSTRAINT [FK_Users_Roles]
如下图:
2、配置连接数据库
在CodeSmith Studio中先配置好连接的数据库,如下图,在Schema Explorer窗口中,点击中间带插头的图标 进行数据库的配置。
3,下载的nhibernate-template解压(这些模板要先下好,当然Code Smith自带有一些模板,但这个Demo用下面的模板),打开Code Smith,新建个目录(点击下图上面那个红框就可以把模板加进来),把解压的nhibernate-template文件全部复制进去,这样就将模板加入”Template Explorer”
右键点击NHibernate.cst,选择“Execute”,弹出设置窗口,在左边的属性窗口进行如下设置。NHibernate.cst会生成类文件和相应的XML配置文件。Outputdirectory是这2个文件的保存路径。
(图a)
SourceDatabase属性在第一次选择时需要配置一个连接字符串(即如果你没有做第二步【数据库连接配置】,在此时就需要配置,如果做了第二步在此就不需要了,直接如上-图a,如何建立连接字符串见下图-图b,注意的是provider type 选择SqlschemaProvider,Connection Stringrr指定好要连接到的数据库),配置好后Code Smith将记录下下来。 Assembly属性代表的是生成文件的默认Assembly名,而NameSpace,就是使用的命名空间了,这里我们全部使用”NHibernateDemo.Model”,点击左下角的Generate,将会在指定的输出目录下产生四个文件:Roles.cs,Roles.hbm.xml 和 Users.cs,Users.hhm.xml。
这样,NHibernate需要的类文件和映射文件生成完了。
(图b)
4, 新建立一个解决方案NHibernateDemo,在解决方案中新建一个类库工程,我们命名为NHibernateDemo.Model,需要注意的是,为了跟刚才生成的文件对应,我们需要在NHibernateDemo.Model工程的属性页中将起Assembly和命名空间名字设为上面的“NHibernateDemo.Model”。如下图c
图c
然后将刚才生成的四个文件Roles.cs和Roles.hbm.xml 及 Users.cs和Users.hbm.xml加入到NHibernateModel工程中来,选中Roles.hbm.xml及Users.hbm.xml文件,在属性窗口中将其“Build Action”(生成操作)设置为“Embedded Resource”(嵌入的资源),如下图d(这是非常重要的一步,否则NHibernate将无法找到映射文件)。
图d
生成项目如下图:
注意:这里需要修改生成的Roles.cs,与 Users.cs 文件,将两个文件中的属性前要加Virtual字段。具体代码:(两个文件下 Public Properties 下的属性都要修改,否则编译通不过)
另外,Roles.hbm.xml代码:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="NHibernateDemo.Model.Role, NHibernateDemo.Model" table="Roles">
<id name="Id" type="Int32" unsaved-value="null">
<column name="RoleId" length="4" sql-type="int" not-null="true" unique="true"
index="PK_Roles"/>
<generator class="native" />
</id>
<property name="RoleName" type="String">
<column name="RoleName" length="50" sql-type="varchar" not-null="false"/>
</property>
<bag name="Userses" inverse="true" lazy="true" cascade="all-delete-orphan">
<key column="RoleId"/>
<one-to-many class="NHibernateDemo.Model.User, NHibernateDemo.Model"/>
</bag>
</class>
</hibernate-mapping>
注意:对于Roles.hbm.xml与 Users.hbm.xml,都需要将生成 xmlns="urn:nhibernate-mapping-2.0" 改成xmlns="urn:nhibernate-mapping-2.2"
5,建立一个控制台工程,命名为NHibernateConsole,添加NHibernate(包括Antlr3.Runtime.dll;NHibernate.dll;NHibernate.ByteCode.Castle.dll,这个NHibernate.dll的程序集要事先准备好,上面已经提供下载地址,或者自行下载下来,加入项目中)和上面NHibernateDemo.Model项目的引用,另外项目中添加一个应用程序配置文件(application.configuration file),App.config的具体配置如下:
//以下是在NHibernate1.1的版本中的配置,如果是上面的NHibernate2.1.2的版本的配置需要做如下的修改(后面叙述)
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nhibernate" type="System.Configuration.NameValueSectionHandler,System,
Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<nhibernate>
<add key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider" />
<add key="hibernate.connection.driver_class" value="NHibernate.Driver.SqlClientDriver" />
<add key="hibernate.connection.connection_string" value="Server=localhost;Initial Catalog=TestNHibernate;Integrated Security=SSPI" />
<add key="hibernate.connection.isolation" value="ReadCommitted"/>
<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" />
</nhibernate>
</configuration>
注意:<add key="hibernate.dialect" value="NHibernate.Dialect.MsSql2005Dialect" />可根据你的具体情况配置成MsSql2000Dialect 或者 MsSql2005Dialect或者 MsSql2008Dialect
此项目具体的截图如下:
备注:
NHibernate2.1.2版本的配置如下(从此处下载http://community.jboss.org/wiki/NHibernateforNET)
在项目下新建一个应用程序配置文件hibernate.cfg.xml
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2" >
<session-factory name="NHibernate.Demo">
<property name="connection.driver_class">
NHibernate.Driver.SqlClientDriver
</property>
<property name="connection.connection_string">Server=localhost;initial catalog=TestNHibernate;Integrated Security=SSPI</property>
<property name="adonet.batch_size">10</property>
<property name="show_sql">true</property>
<property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
<property name="use_outer_join">true</property>
<property name="command_timeout">10</property>
<property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
<property name='proxyfactory.factory_class'>
NHibernate.ByteCode.LinFu.ProxyFactoryFactory,Hibernate.ByteCode.LinFu
</property>
<mapping assembly="NHibernateDemo.Model"/>
</session-factory>
</hibernate-configuration>
说明:
a、<session-factory name="NHibernate.Demo">这个名字(name)不作要求,可自命名
b、要添加这个属性<property name='proxyfactory.factory_class'>
NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu</property>
这个值可以设置成NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu或者NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle具体自己定
c、<mapping assembly="NHibernateDemo.Model"/>你上面程序中实例映射项目的程序集名称
d、对hibernate.cft.xml文件属性作如下配置,否则会出现An exception occurred during configuration of persistence layer这个异常
e.在项目中添加对NHibernate.ByteCode.LinFu.dll或者NHibernate.ByteCode.Castle.dll程序集的引用(上面提供网址的包中已经包含)
如下图:(忽略图中的App000.config.txt,它是1.1中的App.Config,为不影响程序运行,我暂时将其改名)
6,NHibernateTest1Console项目中的program.cs文件
using System;
using System.Collections.Generic;
using System.Text;
using NHibernate;
using NHibernate.Cfg;
using Demo1.Model;
namespace NHibernateTest1Console
{
class Program
{
static void Main(string[] args)
{
//NHibernate.dll 1.1版本时这样写
//Configuration config = new Configuration().AddAssembly("NHibernateDemo.Model");
//当为NHibernate.dll 2.1.2这个版本时,因为配置文件是hibernate.cfg.xml,所以上面//那行代码要改成如下
Configuration config = new Configuration();
config.Configure();
//采用2.1.2方式
ISessionFactory factory = config.BuildSessionFactory();
ISession session = factory.OpenSession();
User user = new User();
user.FirstName = "aa";
user.LastName = "bb";
user.Sex = "Boy";
user.Age = 88;
Role role = new Role();
role.Id = 1;
role.RoleName = "管理员";
user.Role = role;
ITransaction trans = session.BeginTransaction();
try
{
session.Save(user);
trans.Commit();
Console.WriteLine("Insert Success!");
}
catch (Exception ex)
{
trans.Rollback();
Console.WriteLine(ex.Message);
}
}
}
}
注意:Roles中的RoleId与Users中的RoleId为主外键,值必须对应。
7,编译NHibernateConsole,
数据库检查一下,我们想要添加的记录已经成功加入到数据库中!成功通过。