zoukankan      html  css  js  c++  java
  • 一起谈.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()
    {
    //配置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项目)

      参考资料

      Fabio Maulo:ConfORM: NHibernate un-Mapping

  • 相关阅读:
    [Linux]调整swap
    [Linux]mysql错误总结-ERROR 1067 (42000): Invalid default value for TIMESTAMP
    Canvas动画:地球绕着太阳转
    50个好用的前端框架,建议收藏!
    flex布局属性说明
    纯CSS绘制的图形一览
    深入理解CSS盒模型(转)
    JS的防抖与节流学习笔记
    应用八:Vue之在nginx下的部署实践
    css元素居中的几种方式
  • 原文地址:https://www.cnblogs.com/waw/p/2162655.html
Copyright © 2011-2022 走看看