[原创]Fluent NHibernate之旅

ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文档非常多,不过在博客园中,介绍NHibernate的非常少,李哥的NHibernate系列(NHibernate之旅)不失为一个经典,对于新手的我们,需要完全掌握还需要很长一段路,对于新手来说,最初的配置是非常头大的一件事情,好在老赵推荐一个开源的框架Fluent NHibernate,有了它,我们可以完全脱离配置文件,不过博客园中介绍Fluent NHibernate的文章非常少,而且官方文档也还没有完全,所以对于我来说也就一点一点摸索起来,这也激起了我写这个笔记的欲望,废话不说了,下面就介绍Fluent NHibernate,大家也一起来体验一下Fluent Nhibernate的快感吧。

本篇内容:

1、初识Fluent NHibernate(简称Fluent)

2、使用NHibernate和Fluent创建ISessionFactory

3、传统方式和Fluent的对比。

4、灵活的Fluent

 

一、初识Fluent NHibernate(简称Fluent)

Fluent NHibernate offers an alternative to NHibernate's standard XML mapping files. Rather than writing XML documents (.hbm.xml files), Fluent NHibernate lets you write mappings in strongly typed C# code. This allows for easy refactoring, improved readability and more concise code.

这是官方的说明,大体的话也就是用编程的方式进行配置,让你能更好的理解,不需要编写复杂的映射文件,它能完全替换NHibernate的映射文件,让你在映射的时候能使用C#的强类型方式。

在开始之前,我们先下载它的Dll,当然你也可以下载它的源代码进行修改和学习。

下载地址:http://fluentnhibernate.org/

 

 

二、使用NHibernate和Fluent创建ISessionFactory

准备工作:

1、下载Fluent类库,其中已经包含了NHibernate最新版本。

2、下载NHibernate类库,虽然Fluent已经有了最新版本,但我们还需要Proxy的Dll,这里我们使用NHibernate.ByteCode.Castle这个程序集。

3、建立一个空数据库(我们使用MSSql2005),数据库名为:MyNHibernate,这个数据库为信任连接。

在NHibernate中,ISession是操作数据的核心,我们需要通过SessionFactory来建造ISession来进行数据的交互。SessionFactory中反映了数据库映射关系,我们来看下配置:

<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="dialect">NHibernate.Dialect.MsSql2005Dialect</property>
      <property name="connection.connection_string">
        Server=(local);initial catalog=MyNHibernate;Integrated Security=SSPI
      </property>
      <property name="connection.isolation">ReadCommitted</property>
      <property name="proxyfactory.factory_class">
        NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle
      </property>
    </session-factory>
  </hibernate-configuration>

大体的意思我相信大家都懂,数据库类型和数据库的配置,还有一些NHibernate所需的配置,这里的proxyfactory.factory_class是2.1新加入的,至于用处还不是很了解,大家可以看下李大哥的“NHibernate2.1新特性之Tuplizers”。下面我们在代码中创建一个SessionFactory,NHibernate建议我们在一个应用程序中使用一个数据库一个SessionFactory,这里我们用单数据库,代码如下:


 1        public static ISessionFactory GetCurrentFactory()
 2        {
 3            if (sessionFactory == null)
 4            {
 5                sessionFactory = CreateSessionFactory();
 6            }
 7
 8            return sessionFactory;
 9        }
10
11        private static ISessionFactory CreateSessionFactory()
12        {
13            return new Configuration().Configure().BuildSessionFactory();
14        }
15
16        private static ISessionFactory sessionFactory
17        {
18            get;
19            set;
20        }

传统的方式其实已经非常灵活和简单了,但配置文件真的有点头大,那么多的属性,还有很多特性(Attribute),接下来我们来看下Fluent

使用Fluent我们不需要再进行配置,我们可以完全抛开xml文档,前面说过Fluent是对Mapping的一个代码化,Mapping的一切功能,我们都能通过Fluent进行配置。

因为Fluent是基于NHibernate的,它只实现了NHibernate的Mapping功能,其他功能还不能代替,所以我们的项目中要同时引入NHibernate和FluentNHibernate两个类库。代码如下:


 1        public static ISessionFactory GetCurrentFactory()
 2        {
 3            if (sessionFactory == null)
 4            {
 5                sessionFactory = CreateSessionFactory();
 6            }
 7
 8            return sessionFactory;
 9        }
10
11        private static ISessionFactory CreateSessionFactory()
12        {
13            return Fluently.Configure()
14                .Database(
15                    FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
16                        .ConnectionString(s => s.Server(".")
17                                .Database("MyNHibernate")
18                                .TrustedConnection())
19                ).BuildSessionFactory();
20        }
21              private static ISessionFactory sessionFactory
22        {
23            get;
24            set;
25        }

这样就可以了,我们完全抛开了配置,简单的一些代码,已经完成了SessionFactory的配置工作,或许你还有一些配置,在后面的文章中会继续为您讲解。

两种方式的创建写好了,因为是测试,所以写的比较乱,下面我们写一个测试代码,只需要测试一个方法即可。代码如下:

 1[TestMethod]
 2public void NHibernateFactory()
 3{
 4    var factory = TradSessionFactory.GetCurrentFactory();
 5}
 6[TestMethod]
 7public void FluentFactory()
 8{
 9    var factory = FluentSessionFactory.GetCurrentFactory();
10}
11

运行一下,结果如下:

如果数据库配置是正确的话,你会看到如上的结果。

三、传统方式和Fluent的对比

     上面的演示相信大家都能看明白,两者之间的对比也比较明显的显露出来,传统的方式我们只需要编写正确的配置文件,相对比较灵活,一些修改的话都可以在配置文件中进行更新,比如Mappings,而上面的代码,Fluent虽然使用代码的方式进行了配置,省去了配置文件,但灵活性却没有传统方式那么好,修改一些配置的时候,我们得扩充我们的CreateSessionFactory的方法,不过Fluent更符合人类的思考行为,而且有VS这么强大IDE,在编写代码的同时,能够享受强大的智能感知。

     两者之间都各有长短,或许你还没有体会到Fluent的强大,在日后的Mappings时,你会慢慢了解为什么他会叫Fluent。传统方式对于一些经常使用的程序员来说非常简便,加上代码生成工具,使用起来也会游刃有余,但对于新手来说,Fluent绝对是一个好帮手。

四、灵活的Fluent

     那我们Fluent就没有办法灵活了吗?当然不,Fluent的开发者不仅帮你保留了原有的方式,还可以混合你的配置文件,最有意思的时,你还可以使用它来学习NHibernate,甚至可以使用它来开发你自己的自动代码生成工具,因为我也刚学,先介绍一些简单的,至于其他功能,希望大家也能跟我一起学习,体验Fluent带来的快感。

使用NHibernate的配置

     也就是你可以按照原先的方式进行配置,而读取呢使用Fluent来读取,然后创建SessionFactory,或许你感觉这不是多余了嘛,那是因为还没有讲到Mapping,这里我们先介绍一下,如果用Fluent结合传统的配置文件,来创建SessionFactory(后面的代码会简略,只修改上面其中的创建方法)。

private static ISessionFactory CreateSessionFactory()
{
    return Fluently.Configure(new NHibernate.Cfg.Configuration().Configure()).BuildSessionFactory();
}
哈哈,简单吧,我们使用了原先的配置文件,然后用Fluent进行创建,而且我们可以为配置文件中没有的配置进行扩展。
原本打算把Fluent学习的方法说一下,后来一看,必须要先说Fluent的Mapping才能说到这个,所以暂时先不说了,等到下一章映射的部分再一起来说。
文章写得很烂,也当是笔记吧,NHibernate也是刚刚学,惭愧惭愧,学的不是很彻底,今后也会结合NHibernate的学习一起来说。
时间: 2025-01-05 06:46:37

[原创]Fluent NHibernate之旅的相关文章

[原创]Fluent NHibernate之旅(四)-- 关系(上)

经过了前面三篇的介绍,相信大家对Fluent NHibernate已经有一定的了解了,在我们学习中,Fluent 也已经进入了RTM版本.这次的版本发布离RC版只有半个月不到,修正了很多bug,同时补充了大量的功能,在每天更新中,也看到了大量的单元测试,我们相信Fluent NHibernate 已经相对稳定成熟了.RTM相对于RC版本来说,使用方法没有太大的变化,所以不做讲解. 我们后面的教程,会使用RTM版本来演示,希望大家能及时更新(点击下载最新版). Fluent NHibernate之

[原创]Fluent NHibernate之旅二--Entity Mapping

接着上一篇,今天我们说说ORM中的Mapping.如果你要体验NHibernate的强大,首先你就要学会配置,包括SessionFactory和Mapping的配置.今天跟上一篇一样,会使用传统方式和 NHibernate 进行讲解.如果你要亲手试验一下,可以先看一下"Fluent NHibernate之旅一",进行一下数据库和SessionFactory的准备. 本节内容: 简单实体映射 使用自定义类型映射实体属性 NHibernate的实体映射(Entity Mapping)做的非

[原创]Fluent NHibernate之旅(四)-- 关系(中)

接着上一篇,我们继续讲解ORM中的关系.在数据库设计中,我们最多打交道的,要算一对多关系了,延续我们的示例,我们来讲解一下一对多的关系. Fluent NHibernate之旅系列导航: 一.开篇:ISessionFactory Configuration 二.实体映射:Entity Mapping 三.继承映射:Inheritence Mapping 四.一对一映射:One-to-One Mapping 场景和数据库设计 延续我们的演示范例,用户和订单是非常典型的一对多范例. 1.一个用户可以

[原创]Fluent NHibernate之旅(三)-- 继承

经过了"开篇"和"简单映射"两篇文章,相信大家对Fluent NHibernate 有了一定的了解了,FluentNHibernate实际就是对 NHibernate 映射的一定扩展,我们能完全利用强类型.泛型.Lambde表达式等等Vs.Framework等特性简单完成映射工作,同时也能让我们学习NHibernate的映射方式,一举夺得,这么好玩的东东,有理由不继续完成这个系列吗?废话不说,回到正题. 从这一篇开始,我们将使用Fluent NHibernate R

[原创]Fluent NHibernate之旅(四)-- 关系(下)

最近一直忙着准备去旅行的东东,所以进度慢下来了,明天就要出发了,嘿嘿,在出发前,把多对多给写完吧.如果你第一次看这个系列,可以先看看先前几篇,了解下. 一.开篇:ISessionFactory Configuration 二.实体映射:Entity Mapping 三.继承映射:Inheritence Mapping 四.一对一映射:One-to-One Mapping 五.一对多映射:One-to-Many Mapping 场景和数据库设计 前两篇我们介绍了"一对一"和"一

Fluent NHibernate 之旅 导航篇

ORM大家都非常熟悉了吧,我相信也有很多朋友正在用自己或者一些公开的框架,而最常用而且强大的,非Hibernate了(Net中为NHibernate),网上的文档非常多,不过在博客园中,介绍NHibernate的非常少,李哥的NHibernate系列(NHibernate之旅)不失为一个经典,对于新手的我们,需要完全掌握还需要很长一段路,对于新手来说,最初的配置是非常头大的一件事情,好在老赵推荐一个开源的框架Fluent NHibernate,有了它,我们可以完全脱离配置文件,不过博客园中介绍F

Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发

Fluent Nhibernate(以下简称FN)发展到如今,已经相当成熟了,在Nhibernate的书中也相应的推荐了使用FN来进行映射配置,之前写的FN之旅至今还有很多人会来私信我问题,说来惭愧,从FN之旅四至今已经4年多,至今还未更新过此系列,原因有很多,最大的就是懒惰,哈. 安装 现在在项目中使用FN很方便,使用Nuget管理就可以了,但我还是建议大家,可以下载源代码,自己可以详细了解下. 当然,您也可以用命令台来进行安装.说个题外话,NuGet真心不错,至少已经做新项目的时候不用到处去

[Fluent NHibernate]一对多关系处理

目录 写在前面 系列文章 一对多关系 总结 写在前面 上篇文章简单介绍了,Fluent Nhibernate使用代码的方式生成Nhibernate的配置文件,以及如何生成持久化类的映射文件.通过上篇的学习你会发现,Fluent Nhibernate仍然需要引用Nhibernate的两个程序集(Nhibernate.dll和Iesi.Collections.dll),所以与Nhibernate最大的区别就在生成配置文件的方式上面,这里关于Nhibernate的特性方面就不再多赘述,可以参考Nhib

NHibernate之旅(24):探索NHibernate二级缓存(下)

本节内容 引入 使用NHibernate二级缓存 启用缓存查询 管理NHibernate二级缓存 结语 引入 呵呵,今天收到了微软"最有影响力开发者"礼包,很高兴自己荣获"微软最有影响力开发者"称号(详情请进),这篇我还继续上一篇的话题聊聊NHibernate二级缓存剩下的内容,比如你修改.删除数据时,二级缓存是什么策略呢?我们如果使用缓存查询呢?如何管理NHibernate二级缓存呢? 使用NHibernate二级缓存 不知道具体配置的请转到NHibernate之