NHibernate学习(-)在NHibernate框架新建项目与配置文件

原文出处;http://www.cnblogs.com/abluedog/archive/2006/04/15/375862.html

原文作者:abluedog

原文:http://shijie.blog.51cto.com/116032/268628

作者:shijiesj

在此二位的基础上,稍作个人修改。感谢二位。

由于项目需要,最近在学NHibernate,从abluedogshijiesj处受益匪浅。尤其是shijiesj在以前的基础上作了最新的更改,现拿来学习之。

以前的版本都只能在 NHibernate 1.1版本的情况下才能运行,我下面提供了在1.1 版本与2.1.2版本下运行的详解。

源码下载地址:https://files.cnblogs.com/vihone/NHibernate实例源码.rar

基本的软件环境如下:
1
NHibernatewww.nhibernate.org 我下的是NHibernate-2.1.2.GA-bin.zip
2
Code Smithhttp://www.codesmithtools.com/ 我用的是CodeSmith Professional v5.1.3.8510
3
NHibernate模板:点击这里下载 

4. VS2008 +SQL2008 or VS2005 + SQL2005

操作步骤:

新建TestNHibernate数据库(库中包括RolesUsers表,其中Roles中的主键RoleIdUsers表中的外键,一对多的关系)

1Roles表:

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

 

2Users

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 选择SqlschemaProviderConnection 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.csRoles.hbm.xml Users.csUsers.hbm.xml加入到NHibernateModel工程中来,选中Roles.hbm.xmlUsers.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"/>你上面程序中实例映射项目的程序集名称

dhibernate.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,为不影响程序运行,我暂时将其改名)

 

6NHibernateTest1Console项目中的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中的RoleIdUsers中的RoleId为主外键,值必须对应。

 

7,编译NHibernateConsole,

数据库检查一下,我们想要添加的记录已经成功加入到数据库中!成功通过。

 

posted @ 2010-04-23 11:15  Vihone  阅读(1269)  评论(2编辑  收藏  举报