博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NHibernate3剖析:Mapping篇之ConfORM实战(1):概览
阅读量:5958 次
发布时间:2019-06-19

本文共 4974 字,大约阅读时间需要 16 分钟。

对于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是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"的作用。

你能够到 获取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
()); configure.DataBaseIntegration(db => { db.Dialect
(); db.Driver
(); 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
(); 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/

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

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

这篇文章先带着大家走进ConfORM。其细节接下来慢慢介绍,大家有什么问题和思考能够回复。

附上源代码下载: (VS2010项目)

转载地址:http://zvuax.baihongyu.com/

你可能感兴趣的文章
c语言中以追加只写方式打开文本文件,C语言中打开文件读取,写入的操作
查看>>
c语言编程 企业发放,求c语言编程企业员工全年销售额统计及奖金发放系..._统计师_帮考网...
查看>>
C语言编辑中午和英语库,懂英语和C语言的来
查看>>
c语言cabd快速查询的方法,滨州医学院 数据结构C语言版习题精选
查看>>
c语言中秋log10的函数,10本科生的C++成长轨迹7 - ACM培训:数组&函数&指针
查看>>
android 设备运营商,Android设备悲剧:新技术让运营商可以向设备“偷偷”安装软件...
查看>>
html语言link,HTML <link>标签
查看>>
html最小化打开新页面,【html相关】html中如何实现在新标签中打开另一个新的页面?...
查看>>
在html中加入tablestyle,html表格table的使用,以及表格的css样式
查看>>
android全屏监听,Android SurfaceView实现全屏播放例子
查看>>
html console 滚动条,JavaScript - 控制滚动条操作
查看>>
html5中按钮尺寸设计,UI设计中的按钮设计规范
查看>>
html方法介绍,jQuery html()等方法介绍
查看>>
Apache2月9日邮件:Tomcat请求漏洞(Request Smuggling)
查看>>
WPF外包技术分享—WPF的MVVM架构解析(分享)
查看>>
数字签名与数字证书
查看>>
GHOST -BATCH 参数的妙用
查看>>
控制反转 (Inversion of Control, IoC)
查看>>
Catalyst 3850 Series Switch Recovery
查看>>
python datetime模块的timedelta
查看>>