千磨万击还坚劲,任尔东西南北风。这篇文章主要讲述NHibernate3剖析:Mapping篇之ConfORM实战:概览相关的知识,希望能为你提供帮助。
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。其细节接下来慢慢介绍,大家有什么问题和思考能够回复。
【NHibernate3剖析(Mapping篇之ConfORM实战:概览)】附上源代码下载:YJingLee.TryConfOrm.zip (VS2010项目)
推荐阅读
- Android中的动画具体解释系列——飞舞的蝴蝶
- Android Studio,使用外部模拟器作为生成app调试的模拟器
- Android——使用 Intent传递类
- Android入门常见问题
- Android fragment onHiddenChanged方法具体解释
- Android 九宫格
- Android apk安装代码
- android 4.4以上能够实现的沉浸式状态栏效果
- Android有关surfaceView又一次创建的问题。