一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(1):概览

  ORuM思想浮出

  对于ORM(Object Relational Mapping)我们太熟悉了,但是我们从另一个角度可以想象出ORuM(Object Relational un-Mapping)的思想理念。我们在程序中仅仅定义Domain,
而想有个工具可以帮助我们"自动化"实现Mapping,我们无需按传统的ORM思想那样为Domain手动编码Mapping。

  ORuM对于使用者来说更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Object-Relational Intelligent-Mapping)的意思。

  有没有这样的实现呢?答案是相当肯定的。

  ConfORM概述

  ConfORM是NHibernate贡献者Fabio Maulo大牛设计的,是一个配置ORM的工具,其接口按照ORM思想定义,基于GNU Lesser General Public License协议。其设计思想来源就是
ORuM(Object Relational un-Mapping)。它按照Domain定义帮助我们"自动"实现Mapping。现在仅仅实现了对NHibernate的"自动"Mapping,如果有兴趣的话,可以添加对EF实现自动Mapping功能。

  那么ConfORM到底如何"自动"的呢?

  NHibernate对Mapping的处理过程,就是将XML文件反序列化为HbmMapping类,再将HbmMapping类Bind为Mappings,最后Bind SessionFactory。而ConfORM就是利用Domain定
义实现自动生成HbmMapping类,完全避免了编写XML文件和反序列化。这样的话,ConfORM正是起到了ORAWM“object to relational adapter without mappings"的作用。

  你可以到http://code.google.com/p/codeconform/
获取ConfORM

  ConfORM初试

  这是这个系列的第一篇,我们用一个简单的例子实现一下吧,以后慢慢介绍其细节。首先我们写下NHibernate基础代码和通用代码,这一步的代码在将来的文章中也经常使用,以后就不单独贴出来了。

//Code Snippets Copyright http://lyj.cnblogs.com/public static class NhConfig{private const string ConnectionString =@"Data Source=.\SQLEXPRESS;Initial Catalog=NHTest;Integrated Security=True;Pooling=False";public static Configuration ConfigureNHibernate()    {var configure = new Configuration();        configure.SessionFactoryName("Demo");        configure.Proxy(p => p.ProxyFactoryFactory<ProxyFactoryFactory>());        configure.DataBaseIntegration(db =>                                          {                                              db.Dialect<MsSql2008Dialect>();                                              db.Driver<SqlClientDriver>();                                              db.ConnectionString = ConnectionString;                                              db.LogSqlInConsole = true;//用于显示输出SQL});return configure;    }

public static string Serialize(HbmMapping hbmElement)    {var setting = new XmlWriterSettings { Indent = true };var serializer = new XmlSerializer(typeof(HbmMapping));using (var memStream = new MemoryStream(2048))using (var xmlWriter = XmlWriter.Create(memStream, setting))        {            serializer.Serialize(xmlWriter, hbmElement);            memStream.Flush();            memStream.Position = 0;var sr = new StreamReader(memStream);return sr.ReadToEnd();        }    }}

  ConfigureNHibernate()方法用于配置NHibernate,Serialize方法用于输出。我们开始ConfORM之旅吧:

  1.定义一Domain

  开始之旅,我们总是从最简单的入手,将来慢慢学习ConfORM到底如何"自动"为我们复杂的Domain结构生成出Mapping的。

//Code Snippets Copyright http://lyj.cnblogs.com/public class Domain{public virtual int Id { get; set; }public virtual string Name { get; set; }}

  2.ConfORM配置

  这一步非常重要,是ConfORM的核心所在,实例化一个ObjectRelationalMapper对象,装配Domain对象,实例化Mapper对象,调用Mapper对象的CompileMappingFor()方法自动生成HbmMapping。

//Code Snippets Copyright http://lyj.cnblogs.com/public static HbmMapping GetMapping(){var orm = new ObjectRelationalMapper();    orm.TablePerClass<Domain>();var mapper = new Mapper(orm);return mapper.CompileMappingFor(new[] { typeof(Domain) });}

  3.ConfORM之旅

  这一步关键环节是调用Configuration对象的AddDeserializedMapping()方法添加HbmMapping和配置元数据。

//Code Snippets Copyright http://lyj.cnblogs.com/public static void JustForConfOrm(){//配置NHibernatevar conf = NhConfig.ConfigureNHibernate();//在Configuration中添加HbmMappingconf.AddDeserializedMapping(GetMapping(), "Domain");//配置元数据SchemaMetadataUpdater.QuoteTableAndColumns(conf);//创建数据库架构new SchemaExport(conf).Create(false, true);//建立SessionFactoryvar factory = conf.BuildSessionFactory();//打开Session做持久化数据using (var s = factory.OpenSession())    {using (var tx = s.BeginTransaction())        {var domain = new Domain {Name = "我的测试"};            s.Save(domain);            tx.Commit();        }    }//打开Session做删除数据using (var s = factory.OpenSession())    {using (var tx = s.BeginTransaction())        {            s.CreateQuery("delete from Domain").ExecuteUpdate();            tx.Commit();        }    }//删除数据库架构new SchemaExport(conf).Drop(false, true);}

  4.输出XML

  好了,做了上面3步就完成了我们的测试:NHibernate自动创建数据库架构、持久化数据、删除数据、最后把数据库架构删除。这时大家都有一个疑问,ConfORM自动生成的HbmMapping是什么啊?
序列化HbmMapping对象到底输出什么?为了满足大家的需求我们写段代码让ConfORM打印出XML,对照我们以往手写的*.hbm.xml文件看看是否符合:

//Code Snippets Copyright http://lyj.cnblogs.com/public static void ShowXmlMapping(){var document = NhConfig.Serialize(GetMapping());File.WriteAllText("MyMapping.hbm.xml", document);Console.Write(document);}

  这时,我们打开输出目录的MyMapping.hbm.xml文件看看内容:

//Code Snippets Copyright http://lyj.cnblogs.com/<?xml version="1.0" encoding="utf-8"?><hibernate-mapping xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"namespace="YJingLee.ConfOrm" assembly="YJingLee.ConfOrm"xmlns="urn:nhibernate-mapping-2.2">  <class name="Domain">    <id name="Id" type="Int32">      <generator class="hilo" />    </id>    <property name="Name" />  </class></hibernate-mapping>

  恩,是手写的完全一样,ConfORM可以意识到Domain类的成员,Id为主键使用了hilo生成策略,Name为属性。咦,难道只会这样生成?答案当然不是,ConfORM提供了很多模式和定制化,这方面在以后一一介绍。

  仅仅使用了第二步的那几行代码就完成了自动映射的功能,是不是很酷,看过这篇文章后,你是不是非常急切的想跟着我学习下ConfORM,然后试着重构自己的老程序,抛掉hibernate.cfg.xml和*.hbm.xml文件了啊。

  结语

  这篇文章先带着大家走进ConfORM,其细节接下来慢慢介绍,大家有什么问题和思考可以回复。附上源码下载:YJingLee.TryConfOrm.zip
(VS2010项目)

  参考资料

  Fabio Maulo:ConfORM: NHibernate un-Mapping

时间: 2024-10-23 08:05:30

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(1):概览的相关文章

NHibernate3剖析:Mapping篇之ConfORM实战(1):概览

ORuM思想浮出 对于ORM(Object Relational Mapping)我们太熟悉了,但是我们从另一个角度可以想象出ORuM(Object Relational un-Mapping)的思想理念.我们在程序中仅仅定义Domain,而想有个工具可以帮助我们"自动化"实现Mapping,我们无需按传统的ORM思想那样为Domain手动编码Mapping. ORuM对于使用者来说更像ORAM(Object-Relational Auto-Mapping)或者ORIM(Object-

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(3):OneToOne语义

ConfORM概述 在ConfORM实战(1):概览中,描述了ConfORM简单使用.在ConfORM实战(2):原理中介绍了ConfORM的基本实现原理.如果你不熟悉ConfORM请查看前几篇文章,你也可以到http://code.google.com/p/codeconform/获取ConfORM. 在这之前,我们需要为HbmMapping写AsString()扩展方法:用于输出HbmMapping对象的Mapping,用于学习测试使用,具体代码参考这里. 在Domain设计中,关联关系有单

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(4):ManyToMany语义

ConfORM概述 如果你不熟悉ConfORM请查看前几篇文章,你可以到http://code.google.com/p/codeconform/获取ConfORM最新版本. 在Domain设计中经常使用集合,在.Net中的集合有四种:Iesi.Collections.Generic.ISet<T>.System.Collections.Generic.ICollection<T>.System.Collections.Generic.IList<T>.System.C

NHibernate3剖析:Mapping篇之ConfORM实战(4):ManyToMany语义

ConfORM概述 如果你不熟悉ConfORM请查看前几篇文章,你可以到http://code.google.com/p/codeconform/获取ConfORM最新版本. 在Domain设计中经常使用集合,在.Net中的集合有四种:Iesi.Collections.Generic.ISet<T>.System.Collections.Generic.ICollection<T>.System.Collections.Generic.IList<T>.System.C

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(2):原理

ConfORM概述 在上一节中,我用一个简单的例子描述了ConfORM简单使用.留下了很多疑问,大家不解为何使用ConfORM以及怎么使用ConfORM,其内部原理是什么.这节,我们先注重了解一些ConfORM的原理. 你可以到http://code.google.com/p/codeconform/ 获取ConfORM ConfORM重要接口 ConfORM的核心就是实例化一个ObjectRelationalMapper对象和Mapper对象,配置Domain对象,调用Mapper对象的Com

一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(5):Component语义

Component语义 使用ConfORM"映射"组件,我们无需特别设置,ConfORM内部会根据Domain定义来判定组件,一般而言,没有主键的类就是组件. [Test]public void ComponentMappingDemo(){//show how work with components and how ConfORM understands OOPvar orm = new ObjectRelationalMapper();var mapper = new Mappe

NHibernate3剖析:Mapping篇之ConfORM实战(5):Component语义

Component语义 使用ConfORM"映射"组件,我们无需特别设置,ConfORM内部会根据Domain定义来判定组件,一般而言,没有主键的类就是组件. [Test] public void ComponentMappingDemo() { //show how work with components and how ConfORM understands OOP var orm = new ObjectRelationalMapper(); var mapper = new

一起谈.NET技术,NHibernate 3.0.0.Alpha1 发布及新特性介绍

发布 刚刚NHibernate的Leader--Fabio Maulo发布了NHibernate 3.0.0.Alpha1版本,这是NHibernate 3.0.0的第一个公开测试版本. 下载地址 你可以到这里下载NHibernate 3.0.0.Alpha1,基于.Net3.5平台,具体文件如下. NHibernate源码:NHibernate-3.0.0.Alpha1-src.zip NHibernate二进制文件:NHibernate-3.0.0.Alpha1-bin.zip 特性介绍 N

一起谈.NET技术,NHibernate3.0剖析:Query篇之NHibernate.Linq标准查询

系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种应用程序的集成,基于NHibernte3.0版本.如果你还不熟悉NHibernate,可以快速阅读NHibernate之旅系列文章导航系列入门,如果你已经在用NHibernate了,那么请跟上NHibernate3.0剖析系列吧. NHibernate专题:http://kb.cnblogs.com