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项目)
NHibernate3剖析:Mapping篇之ConfORM实战(1):概览的更多相关文章
- NHibernate3剖析:Mapping篇之集合映射基础(3):List映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate3剖析:Mapping篇之集合映射基础(2):Bag映射
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- NHibernate3剖析:Query篇之NHibernate.Linq增强查询
系列引入 NHibernate3.0剖析系列分别从Configuration篇.Mapping篇.Query篇.Session策略篇.应用篇等方面全面揭示NHibernate3.0新特性和应用及其各种 ...
- linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】
转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c July ...
- 菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程
菜鸟nginx源代码剖析 框架篇(一) 从main函数看nginx启动流程 Author:Echo Chen(陈斌) Email:chenb19870707@gmail.com Blog:Blog.c ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...
- 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...
随机推荐
- 负载平衡(cogs 741)
«问题描述:G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运.«编程任务:对于给定的n 个环 ...
- 团体天梯赛 L3-001. 凑零钱
L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...
- linux下的用户组管理
用户组管理分两类 如果赋给组什么权限,那么组员就会有什么权限 1.私有组 在创建新用户的时候,就要为用户指定组.如果没有指定,就会默认创建一个与用户名相同的用户组,这个用户组只有该用户一个用户,就被称 ...
- [LeetCode] Reorder List 反向插入链表
Given a singly linked list L: L0→L1→…→Ln-1→Ln,reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do thi ...
- hdu 6218 Bridge 线段树 set
题目链接 题意 给一个\(2\)x\(n\)的矩阵,每个格子看成一个点,每个格子与相邻的格子间有边.现进行一些加边与删边操作,问每次操作后图中有多少条割边. 思路 参考 https://www.cnb ...
- 【linux高级程序设计】(第八章)进程管理与程序开发 5
守候进程 启动方式: 在系统启动时由/etc/rd.d目录下的启动脚本启动 利用inetd超级服务器启动 有cron命令定时启动,以及在终端用nohup命令启动 守护进程编程要点 (1)屏蔽有关控制终 ...
- Oracle创建自增长主键
Oracle主键常用的分为UUID和自增长int两种,下面简单说下各自的优缺点: UUID的优点 1.生成方便,不管是通过sys_guid() 还是java的uuid都能很方便的创建UUID. 2.适 ...
- Linux每日一坑002
0.删除软连接目录时,目录后面一定不要有斜杠!最好用mv代替rm. 1.数据库安装后要初始化数据库,不然无法登陆,会报权限错误,原谅我的无知,跪了. mysql_install_db --user=m ...
- 1219 骑士游历(棋盘DP)
1997年 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 设有一个n*m的棋盘(2≤n≤50,2≤m≤50),如 ...
- my -> mysql on duplicate key update使用总结
CREATE TABLE `t_duplicate` ( `a` int(11) NOT NULL, `b` int(255) DEFAULT NULL, `c` int(255) DEFAULT N ...