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文件的属性(右键->属性)中的“生成操作”设置为“嵌入的资源”。
至此配置应该算是完成了。
本文介绍了如何在.NET项目中配置和使用NHibernate ORM框架,包括在业务逻辑层导入DLL,配置hibernate.cfg.xml文件,以及在领域模型层设置实体类与数据库表的映射。详细讲解了配置过程中的关键点,如DLL的选择、XML文件的设置以及实体类的属性要求。
1408

被折叠的 条评论
为什么被折叠?



