首页 > [原创]Fluent NHibernate之旅

[原创]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.MsSql2005Dialectproperty>

      
<property name="connection.connection_string">

        Server=(local);initial catalog=MyNHibernate;Integrated Security=SSPI

      
property>

      
<property name="connection.isolation">ReadCommittedproperty>

      
<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()

 2ExpandedBlockStart.gifContractedBlock.gif        {

 3            if (sessionFactory == null)

 4ExpandedSubBlockStart.gifContractedSubBlock.gif            {

 5                sessionFactory = CreateSessionFactory();

 6            }


 7

 8            return sessionFactory;

 9        }


10

11        private static ISessionFactory CreateSessionFactory()

12ExpandedBlockStart.gifContractedBlock.gif        {

13            return new Configuration().Configure().BuildSessionFactory();

14        }


15

16        private static ISessionFactory sessionFactory

17ExpandedBlockStart.gifContractedBlock.gif        {

18            get;

19            set;

20        }


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

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

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

 1        public static ISessionFactory GetCurrentFactory()

 2ExpandedBlockStart.gifContractedBlock.gif        {

 3            if (sessionFactory == null)

 4ExpandedSubBlockStart.gifContractedSubBlock.gif            {

 5                sessionFactory = CreateSessionFactory();

 6            }

 7

 8            return sessionFactory;

 9        }

10

11        private static ISessionFactory CreateSessionFactory()

12ExpandedBlockStart.gifContractedBlock.gif        {

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

22ExpandedBlockStart.gifContractedBlock.gif        {

23            get;

24            set;

25        }


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

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



 1[TestMethod]

 2public void NHibernateFactory()

 3ExpandedBlockStart.gifContractedBlock.gif{

 4    var factory = TradSessionFactory.GetCurrentFactory();

 5}


 6[TestMethod]

 7public void FluentFactory()

 8ExpandedBlockStart.gifContractedBlock.gif{

 9    var factory = FluentSessionFactory.GetCurrentFactory();

10}


11

运行一下,结果如下:

image

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

三、传统方式和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的学习一起来说。

转载于:https://www.cnblogs.com/inday/archive/2009/08/04/Study-Fluent-NHibernate-Start.html

更多相关:

  • 转载于http://abluedog.cnblogs.com/archive/2006/04/15/375862.html 基本的软件环境如下: 1.NHibernate http://www.nhibernate.org/  2.Code Smith http://www.codesmithtools.com/ 3.NHiberna...

  • 英语的重要性,毋庸置疑!尤其对广大职场人士,掌握英语意味着就多了一项竞争的技能。那,对于我们成人来说,时间是最宝贵的。如何短时间内在英语方面有所突破,这是我们最关心的事情。英语学习,到底有没有捷径可以走,是否可以速成?周老师在这里明确告诉大家,英语学习,没有绝对的捷径走,但是可以少走弯路。十多年的教学经验告诉我们,成功的学习方法可以借...

  • 展开全部 其实IDLE提供了一个显32313133353236313431303231363533e78988e69d8331333365663438示所有行和所有字符的功能。 我们打开IDLE shell或者IDLE编辑器,可以看到左下角有个Ln和Col,事实上,Ln是当前光标所在行,Col是当前光标所在列。 我们如果想得到文件代码...

  • 前言[1]从 Main 方法说起[2]走进 Tomcat 内部[3]总结[4]《Java 2019 超神之路》《Dubbo 实现原理与源码解析 —— 精品合集》《Spring 实现原理与源码解析 —— 精品合集》《MyBatis 实现原理与源码解析 —— 精品合集》《Spring MVC 实现原理与源码解析 —— 精品合集》《Spri...

  • 【本文摘要】【注】本文所述内容为学习Yjango《学习观》相关视频之后的总结,观点归Yjango所有,本文仅作为学习之用。阅读本节,会让你对英语这类运动类知识的学习豁然开朗,你会知道英语学习方面,我们的症结所在。学习英语这类运动类知识,需要把握四个原则第一,不要用主动意识。第二,关注于端对端第三,输入输出符合实际情况第四,通过多个例子...

  • 点云PCL免费知识星球,点云论文速读。文章:RGB-D SLAM with Structural Regularities作者:Yanyan Li , Raza Yunus , Nikolas Brasch , Nassir Navab and Federico Tombari编译:点云PCL代码:https://github.co...