菜鸟初探NHibernate(2.1.0.Alpha2)笔记

 目录导航:

 

1.       前言

2.       开工

3.       业务域模型

3.1 编写业务域模型

3.2 数据库脚本

3.3 映射文件

4.       hibernate.cfg.xml配置

5.       表现层设计

6.       参考文献

 

1.前言

小生初学.NETNHibernate,文笔很粗糙,纯粹是做为一份学习笔记,文中有涉及到的错误望各位多多指出,谢谢。

 

话说在同老哥的一次对话中,不经意之间提到了ORM,怀着无比好奇的心迈进了NHibernate的神奇世界中。

 

小生使用的是NHibernate最新版本2.1.0.Alpha2.。还没开始动手实践之前,在网络上翻了大量的NHibernate教程, 由于版本间的差异,在配置过程中是有所不同的,造成后来一次次失败的原因。

 

2.开工

 

学习目的:创建一个简单的NHibernate应用程序,加深一下对NHibernate基础知识。

 

环境:Windows 2003 + VS 2005 + Sql Server2000 + NHibernate 2.1.0.Alpha2

 

解包后目录结构如下:

├─Configuration_Templates

├─Required_Bins

├─Required_For_LazyLoading

 ├─Castle

 ├─LinFu

 └─Spring

└─Tests

 

先把Required_Bins目录中的nhibernate-configuration.xsdnhibernate-mapping.xsd拷贝到%VS2005安装目录%"Xml"Schemas文件夹里。

这两个文件的作用:编辑NHibernate配置文件和映射文件的时候会产生智能提示。

 

新建一个空白解决方案命名为:NHibernate

 

项目结构如下:

 

 

3.业务域模型

 

3.1 编写业务域模型

 

先来定义一个简单的业务域模型为:Students,其中有IDName两个属性。

 

 

创建相应的。NET类定义和数据库表

 

namespace Model

{

    public class Students

    {

        private int _ID;

        private string _Name;

 

        public int ID

        {

            get { return _ID; }

            set { _ID = value; }

        }

 

        public string Name

        {

            get { return _Name; }

            set { _Name = value; }

        }

 

    }

}

 

3.2数据库脚本

 

数据库表Students脚本如下:

CREATE TABLE [dbo].[Students] (

       [ID] [int] IDENTITY (1, 1) NOT NULL ,

       [Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL

) ON [PRIMARY]

GO

 

3.3映射文件

 

现在开始为Students编写ORM映射文件,这一些有很多细节部分值得注意,也是造成错误的源头之一。

 

 

Students.hbm.xml架构 - 选择文章提过的nhibernate-mapping.xsd文件。

 

Students.hbm.xml如下:

 

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Model" namespace="Model">

 <class name="Model.Students,Model" table="Students" lazy="false">

    <id name="ID" column="ID" type="Int32">

      <generator class="identity" />

    </id>

    <property name="Name" type="String" length="50" />

 </class>

</hibernate-mapping>

 

说明:映射配置文件中的class元素的name指定业务对象全名及其所在程序集,table指定数据表的名称,column指定表的字段关系,type指定字段的数据类型,generator元素则指明主键字段唯一值的生成方法,常用的主健产生方式有自增型(identity)和赋值型(assigned)。identity表示Nhbernate使用Sql Server提供的自增加唯一值的方法,如果想给ID属性赋值来保证唯一性的话,可以为assigned。

 

注意:请别忘了将Students.hbm.xml的生成操作设为:嵌入的资源。

否则会产生:No persister for: Model.Students

 

 

生成一下Model项目。

 

4. hibernate.cfg.xml配置

                                              

接下来配置hibernate.cfg.xml文件,2.1.02.0的配置有所不同。

1.        2.1.0中要求加入对NHibernate.ByteCode.LinFuNHibernate.ByteCode.Castle的引用,并在配置里加上

<property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

<property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

否则出错如下:

 

2.        使用2.1.0之前需要把.NET Framework 2.0升级至SP1.

http://www.microsoft.com/Downloads/details.aspx?familyid=79BC3B77-E02C-4AD3-AACF-A7633F706BA5&displaylang=en

       否则出现:未能从程序集“mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”中加载类型“System.DateTimeOffset”。

 

完整的/bin/hibernate.cfg.xml如下:

<?xml version="1.0" encoding="utf-8" ?>

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">

 <session-factory>

    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>

    <property name='proxyfactory.factory_class'>NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</property>

<property name="connection.provider">NHibernate.Connection.DriverConnectionProvider, NHibernate</property>

<!-- SQL方言,这边设定的是MsSQL2000 -->

<property name="dialect">NHibernate.Dialect.MsSql2000Dialect</property>

<!-- Hibernate的连接加载类 -->

<property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>

<!—数据库连接字符串 -->

<property name="connection.connection_string">server=(local);database=Hibernate;uid=sa;pwd=123456</property>

<!—true表示将Hibernate发送给数据库的sql显示出来 -->

    <property name="show_sql">true</property>

    <property name="adonet.batch_size">10</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>

<!—关键:即要映射的程序集名-->

    <mapping assembly="Model"/>

 </session-factory>

</hibernate-configuration>

 

<mapping assembly=”Model”/>没有添加的话一样会出现:

No persister for: Model.Students

 

出错内容同样与2.0.1不一样。

 

5. 表现层设计

 

编写表现层,添加引用以下几个文件Model.dllRequired_Bins"NHibernate.dllRequired_For_LazyLoading"Castle"NHibernate.ByteCode.Castle.dllRequired_For_LazyLoading"LinFu"NHibernate.ByteCode.LinFu.dll

 

表现层代码如下:

using System;

using System.Data;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using NHibernate;

using NHibernate.Cfg;

using Model;

 

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

{

     //Configure()会搜索配置文件里<mapping assembly="Model"/>并加载

        Configuration cfg = new Configuration().Configure();

//创建session对象,ISession对象提供一个到后台数据库的连接

        ISessionFactory factory = cfg.BuildSessionFactory();

        ISession session = factory.OpenSession();

//ITransaction对象提供一个可以被NHibernate管理的事务。

        ITransaction tx = session.BeginTransaction();

        Students sd = new Students();

        sd.Name = "陈小明";

//保存到数据库里

        session.Save(sd);

//事务提交

        tx.Commit();

         //最后调用session的Close方法来释放NHibernate所使用的asp.net连接资源

        session.Close();

    }

}

浏览一下页面后打开数据库,发现数据已经被添加进来了。

 

代码很简短,很整洁,不再使用到SqlConnection,SqlCommand等对象为来操作数据库。

 

谢谢!同时希望可以结识志同道合的朋友。

 

6.参考文献:

http://www.cnblogs.com/chenou/articles/880259.html

[NHibernate使用简介]

http://www.cnblogs.com/chenxizhang/archive/2009/04/12/1434025.html

[Could not load type 'System.DateTimeOffset'的问题]

http://blogs.hibernatingrhinos.com/nhibernate/archive/2008/04/01/your-first-nhibernate-based-application.aspx

[Your first NHibernate based application]

 

文章来源:博客园

文章地址:http://www.cnblogs.com/kine/articles/1459351.html

作者:kine

posted @ 2009-05-18 14:22  印刷回忆  阅读(1181)  评论(0)    收藏  举报