一起谈.NET技术,NHibernate3剖析:Mapping篇之ConfORM实战(1):概览_weixin_34187862的博客-程序员秘密

技术标签: java  操作系统  

  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

转载于:https://www.cnblogs.com/waw/archive/2011/09/01/2162655.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34187862/article/details/94556129

智能推荐

SyntaxHighlighter代码高亮插件_lilei_scut的博客-程序员秘密

SyntaxHighlighter是Google Code上的一个开源项目,主要用于给网页上的代码着色,使用十分方便,效果也不错,而且几乎支持常见的所有语言。使用步骤:一、下载并解压缩SyntaxHighlighter(百度一下)当前版本3.0.83二、引入文件将解压后的scripts和styles文件夹复制到项目中,在页面中引入shCore.js和核心CSS文件shCore.

telnet端口问题_weixin_33749131的博客-程序员秘密

今天测试发现telnet 一个端口不通,开始还以为是服务开放这个端口有问题,后来才发现这个端口是udp的。而telnet下层走的tcp协议,自然无法测试那些tcp的端口。而之前下意识里还总以为都可以用它来测试端口通不通呢,还是网络基础知识不扎实啊。如果要测远程udp端口情况,可以用nmap。...

计算机二级mysql考几科_计算机二级考试该选哪一科目?_LilacYue的博客-程序员秘密

原标题:计算机二级考试该选哪一科目?科目分类计算机二级考试科目一共九科:分别是二级C、二级C++、二级VB、二级Python、二级JAVA、二级ACCESS、MS Office高级应用、MySQL数据库程序设计、WEB程序设计。计算机二级考试主要分两类:一类是语言程序设计,(如:C、C++、Python、Java、Visual Basic、WEB);另一类是数据库程序设计(如:Access、MyS...

Bellman-Ford最短路径算法应用----城市间最短路径(包括负值)_chaRon522的博客-程序员秘密

#include &lt;stdio.h&gt;#include &lt;string.h&gt;#include &lt;stdlib.h&gt;#include &lt;stdbool.h&gt;struct Dis{ /*记录起点到每个顶点的最短路径信息*/ //string path; int weight; int pre; char path[100];}dis...

随便推点

eclipse 镜像_eclipse镜像有什么用_been_through的博客-程序员秘密

官网下载又慢又容易中断,用户体验极差镜像 https://mirrors.tuna.tsinghua.edu.cn/eclipse/technology/epp/downloads/release/建议不要下最新的,很容易不兼容

商城项目-实现基本搜索_cwl_java的博客-程序员秘密

2.实现基本搜索2.1.页面分析2.1.1.页面跳转在首页的顶部,有一个输入框:当我们输入任何文本,点击搜索,就会跳转到搜索页search.html了:并且将搜索关键字以请求参数携带过来:我们打开search.html,在最下面会有提前定义好的Vue实例:&lt;script type="text/javascript"&gt; var vm = new Vue({ ...

软件逆向篇(ollydbg初识)_Huterox的博客-程序员秘密

下载ollydug(作为一个科技的忠实爱好者,今天终于走向的这条道路不由得有点小激动呀.)在这里的话我没有直接使用下载ollydeg,而是使用集成工具,在这里先感谢一下来自52破解论坛的老哥们,他们提供里一套健全的软件破解工具集合)下载地址:链接:https://pan.baidu.com/s/1EipaS1ocjH5EIz0EsQoUBQ提取码:6666在解压的过程中杀毒软件可能会报毒,这里的话不用担心,其实是有一些工具比较敏感,所以的话可能会报毒.这里的话可以放心.目标软件先上我们的

WebStorm 2018.2.1破解?_墓亦龍的博客-程序员秘密

 1、下载Webstrom安装文件,官网网址:https://www.jetbrains.com/webstorm/   2、安装步骤      3、具体破解步骤 黑色背景或白色背景,看个人喜好  4、本地安装bin目录下引入破解文件,并配置到对应的配置文件中。 破解文件下载地址...

Vue - 安装Node.js(配置环境变量、配置NPM下载存放目录、NPM设置镜像仓库)_ITKaven的博客-程序员秘密

Vue学习(十八)- 安装Node.js和使用Webpack打包Vue项目安装Node.jsNode.js下载地址根据自己的操作系统下载相应的安装包。一直下一步即可。配置环境变量。在CMD中运行node -v和npm -v两条命令,如果都能输出版本号,说明nodejs安装成功。博主习惯将npm安装的包放在安装nodejs的目录下,方便统一管理。npm config set prefix "E:\tools\nodejs\node_global"npm config set cach