初识NHibernate(配置篇)

本文介绍了如何在.NET项目中配置和使用NHibernate ORM框架,包括在业务逻辑层导入DLL,配置hibernate.cfg.xml文件,以及在领域模型层设置实体类与数据库表的映射。详细讲解了配置过程中的关键点,如DLL的选择、XML文件的设置以及实体类的属性要求。

Nhibernate算是比较成熟的一个ORM框架,想想用过的NET中的ORM,算起来大致有以下几种

1、ADO.NET Entity Framework

2、Nhibernate

3、Linq to sql Class(也算一个吧)

4、DataSet

还有没有过的类似IBatis等。

 

本人才疏学浅,对高层的理论不很精通,只能达到在项目中会用的程度,以下篇幅仅限介绍如何在项目中配置、使用等,仅以自己在项目中的经验来记录我的学习过程,如果有幸能帮上别人,则不胜欣慰。

 

1、NHibernate配置。

 

先贴下自己的项目结构:主要涉及业务逻辑层(图1)和领域模型层(DomainModels,图2)。

图1

图2

 

BLL称为业务逻辑层,这里由于业务逻辑简单,我将业务逻辑和对ORM的CRUD操作都放在这里,以下简称业务层。Models就是所谓的领域模型层,以下简称模型层。

 

我用步骤标示配置的过程:

①在业务层导入DLL。我们看到BLL层有一个SharedLibs文件夹,这个里面主要放了NHibernate相关的DLL,其实这个文件夹主要是为了看着清晰才建的,熟练的话完全可以不用建立这个文件夹,可以直接通过浏览添加这些引用。我们看看里面都有什么。

图3

这里有一些DLL和XML,还有一些PDB文件,PDB是debug情况下产生的一些文件,我们可以将其删去。加入了XML文件,你在使用NHibernate的一些方法的时候你会看到提示。

在BLL层,引入三个DLL,“Iesi.Collections.dll”、“NHibernate.dll”和“NHibernate.ByteCode.Castle.dll”(别问我为什么只需要引入3个,应该是依赖了其他的吧,具体不祥,有知道的欢迎告诉我。)

然后加入config文件“hibernate.cfg.xml”,内容如下,解释稍后。

 

<?xml version="1.0" encoding="utf-8"?>
<hibernate-configuration  xmlns="urn:nhibernate-configuration-2.2" >
  <session-factory>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="connection.connection_string">
      Data Source=LEFT-PC\Left_2005;Initial Catalog=jesonsoft;
      Integrated Security=True;Pooling=False
    </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.Castle.ProxyFactoryFactory,
      NHibernate.ByteCode.Castle
    </property>
    <mapping assembly="Models" />
  </session-factory>
</hibernate-configuration>

强调三点:

第一、xmlns="urn:nhibernate-configuration-2.2" 这个版本号“2.2”一定要和model层.hbm.xml文件里面的版本号对应起来。

第二、<property name="proxyfactory.factory_class">      NHibernate.ByteCode.Castle.ProxyFactoryFactory,      NHibernate.ByteCode.Castle    </property>我选择的是Castle的代理,还可以选择LinFu和Spring,具体有什么区别我也没研究,以后知道了贴上来。

第三、<mapping assembly="Models" />,这里的assembly要正确设置。

 

最后要注意的是,这个hibernate.cfg.xml文件的属性“复制到输出目录”要设置为“始终复制”。

②下面讲Models层的配置

好吧,简单点来codesmith………………。贴个简单的代码,包含属性和关系的

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
	<class name="Models.Entities.JsarticleType, Models" table="js_articleTypes">
		<id name="Id" type="Int32" unsaved-value="null">
			<column name="ArticleTypeId" length="4" sql-type="int" not-null="true" unique="true" index="PK_js_articleTypes"/>
			<generator class="native" />
		</id>
		<property name="ArticleTypeName" type="String">
			<column name="ArticleTypeName" length="50" sql-type="nvarchar" not-null="false"/>
		</property>
		<property name="CreateTime" type="DateTime">
			<column name="CreateTime" length="8" sql-type="datetime" not-null="false"/>
		</property>
		<property name="LastModifyTime" type="DateTime">
			<column name="LastModifyTime" length="8" sql-type="datetime" not-null="false"/>
		</property>
		<property name="DeleteFlag" type="Int16">
			<column name="DeleteFlag" length="2" sql-type="smallint" not-null="true"/>
		</property>
		<many-to-one name="CreateUser" class="Models.Entities.Jsuser, Models">
			<column name="CreateUserId" length="4" sql-type="int" not-null="false"/>
		</many-to-one>
		<many-to-one name="ParentTypeId" class="Models.Entities.JsarticleType, Models">
			<column name="ParentTypeId" length="4" sql-type="int" not-null="false"/>
		</many-to-one>
		<bag name="ParentTypeIdjs_articleTypeses" inverse="true" lazy="true" cascade="all-delete-orphan">
			<key column="ParentTypeId"/>
			<one-to-many class="Models.Entities.JsarticleType, Models"/>
		</bag>
		<bag name="js_articleses" inverse="true" lazy="true" cascade="all-delete-orphan">
			<key column="ArticleTypeId"/>
			<one-to-many class="Models.Entities.Jsarticle, Models"/>
		</bag>
	</class>
</hibernate-mapping>


相信这个代码贴出来,大家仔细看看就能看懂里面的意思,<class name="Models.Entities.JsarticleType, Models" table="js_articleTypes">这一段,Models.Entities.JsarticleType是指的实体类,后面的table代表DB中的表,这个xml也就是实体类和db中表的映射。

 

对应的Model贴出来

using System;
using System.Collections;

namespace Models.Entities
{
    #region JsarticleType

    /// <summary>
    /// JsarticleType object for NHibernate mapped table 'js_articleTypes'.
    /// </summary>
    public class JsarticleType
    {
        #region Public Properties

        public virtual int Id
        {
            get;
            set;
        }

        public virtual string ArticleTypeName
        {
            get;
            set;
        }

        public virtual DateTime CreateTime
        {
            get;
            set;
        }

        public virtual DateTime LastModifyTime
        {
            get;
            set;
        }

        public virtual short DeleteFlag
        {
            get;
            set;
        }

        public virtual Jsuser CreateUser
        {
            get;
            set;
        }

        public virtual JsarticleType ParentTypeId
        {
            get;
            set;
        }

        public virtual IList ParentTypeIdjs_articleTypeses
        {
            get;
            set;
        }

        public virtual IList js_articleses
        {
            get;
            set;
        }

        #endregion
    }

    #endregion
}


 

注意这个Model里面的属性要设为Virtual的,否则会报错。注意看.hbm.xml文件中的<class name="Models.Entities.JsarticleType, Models" table="js_articleTypes">中的name="Models.Entities.JsarticleType,是对应的实体类的全限定名,开始我认为这个在Mapping文件夹下,应该是name="Models.Mapping.JsarticleType,结果搞了好久,现在明白了,这个就是实体类的全限定名,这个.hbm.xml就是把实体类和db中的表进行映射。

特别注意:所有的.hbm.xml文件的属性(右键->属性)中的“生成操作”设置为“嵌入的资源”。

 

至此配置应该算是完成了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值