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()
{
    //配置NHibernate
    var conf = NhConfig.ConfigureNHibernate();
    //在Configuration中加入HbmMapping
    conf.AddDeserializedMapping(GetMapping(), "Domain");
    //配置元数据
    SchemaMetadataUpdater.QuoteTableAndColumns(conf);
    //创建数据库架构
    new SchemaExport(conf).Create(false, true);
    //建立SessionFactory
    var 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项目)

时间: 2024-12-23 22:39:35

NHibernate3剖析:Mapping篇之ConfORM实战(1):概览的相关文章

NHibernate3剖析:Mapping篇之ConfORM实战(3):OneToOne语义

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Mapping篇之ConfORM实战(2):原理

系列引入 NHibernate3剖析系列分别从Configuration篇.Mapping篇.Session篇.Core篇.Tool篇.Practice篇.Extension篇等方面全面揭示NHibernate3版本内容.特性及其应用,完全基于NHibernte3版本. NHibernate专题:http://kb.cnblogs.com/zt/nhibernate/ NHibernate官方站点:http://nhforge.org/ NHibernate参考文档:http://nhforge

NHibernate3剖析:Mapping篇之Mapping概览

Mapping概述 NHibernate作为典型的ORM工具,我们使用时通常是先定义Domain,再为Domain映射数据库关系,NHibernate映射是使用XML文件形式的.本篇从整体上了解下NHibernate Mapping处理过程及我们编写方式. Mapping处理过程 当我们Confrontation NHibernate时,NHibernate对Mapping部分到底做了什么事情呢? 解析读取Mapping文件 将Mapping文件反序列化(Deserialize)为XmlDese

NHibernate3剖析:Mapping篇之集合映射基础(3):List映射

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

NHibernate3剖析:Mapping篇之集合映射基础(4):Map映射

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

NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射

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

NHibernate3剖析:Query篇之NHibernate.Linq自定义扩展

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

NHibernate3剖析:Query篇之NHibernate.Linq增强查询

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

React-Native入门指南——第4篇react-native布局实战(二)

React-Native入门指南 github:https://github.com/vczero/react-native-lession React-Native:用JavaScript开发你的原生应用,释放Native的UI体验,体验 Hybird开发效率. 最近一个星期写的文章如下,链接是github page的,其实也可以在系列博客找到相应文章: 第1篇hello react-native 第2篇认识代码结构 第3篇css和布局 第4篇学会react-native布局(一) 第4篇re