• 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,

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

     

  • 相关阅读:
    python自动发邮件库yagmail
    Vmware改成bridge方式联网
    centos7 更新Firefox版本
    无法应用转换程序,请检查指定的转换程序路径是否有效
    python中list/tuple/dict/set的区别
    Python中的*arg和**kwarg
    centos7.4下搭建JDK+Tomcat+Nginx+Mysql+redis+Mongodb+maven+Git+Jenkins
    用 Apache Derby 进行 ODBC 编程
    Derby 命令
    Python与数据库
  • 原文地址:https://www.cnblogs.com/vihone/p/1718249.html
Copyright © 2020-2023  润新知