Mapping概述
NHibernate作为典型的ORM工具,我们使用时通常是先定义Domain,再为Domain映射数据库关系,NHibernate映射是使用XML文件形式的。本篇从整体上了解下NHibernate Mapping处理过程及我们编写方式。
Mapping处理过程
当我们Confrontation NHibernate时,NHibernate对Mapping部分到底做了什么事情呢?
- 解析读取Mapping文件
- 将Mapping文件反序列化(Deserialize)为XmlDeserialized(就是NHibernate.Cfg.MappingSchema.HbmMapping类)
- 将HbmMapping类Bind为元数据映射(Mapping-MetaDate),(就是NHibernate.Cfg.Mappings类)
- Build SessionFactory
用一副图片(摘自Fabio Maulo博客)详细的展示了NHibernate内部的原理:
接下来我们看看NHibernate的各种映射方式。
Mapping方式
据我长期发现,初学者往往最热衷问的问题是"你们通常怎样写映射文件,是生成的么?",还有问问题有时贴出XML映射的时候总是贴出使用生成器生成出来的映射。
NHibernate映射编写方式现在有很多种了,例如:
- 生成工具软件 (尽量不要使用)
- 相关开源项目 (可以使用)
- 手动编写XML方式 (推荐使用)
从上面的图示可以看出,上面所有的方式最终都是生成XML文件,然后按照Mapping处理过程去处理。
生成工具软件
现在生成工具软件有很多了,例如商业软件:CodeSmith、Visual NHibernate,开源软件:MyGeneration、NHibernate Modeller、AjGenesis等。
CodeSmith
官方地址:http://www.codesmithtools.com/
提供了NHibernate模板,可以按照需求生成Mapping文件。
Visual NHibernate
是最新出来的可视化NHibernate映射工具。可以试用一下,效果不错。
MyGeneration
官方地址:http://www.mygenerationsoftware.com/
像CodeSmith、MyGeneration生成工具NHibernate模板各式各样,生成出来映射、结构不一,非常冗余,对于复杂的Domain总会出现各式各样的错误映射, 大多数时候只是在无可奈何的情况下使用,不过调查发现生成工具往往是初学者的最爱,总觉得不怎么样。
AjGenesis
官方地址:http://ajgenesis.codeplex.com/
AjGenesis是一个开源项目,按照你定义的模板生成出很多东东,支持语言Java, JSP, ASP.NET, VB.NET, C#, PHP。生成包含有entities, pages, solution和project files, store procedures, DDL scripts等等。
相关开源项目
开源类库有很多,例如NHibernate贡献项目dll2hbm、NHibernate MappingAttributes,开源项目的Castle ActiveRecord、Fluent NHibernate等。
其中NHibernate MappingAttributes和Castle ActiveRecord是在Domain中使用Attribute形式映射的,完全污染了Domain职责。
Fluent NHibernate使用Fluent API形式映射,其API依旧繁琐,其运行最终效果还是利用你映射的Fluent在内部生成非常冗余的XML文件。
手动编写XML方式
发现更多的人都喜欢自己手动编写XML文件的,这样比较灵活、简便,在这里我也特别推荐使用,一方面熟悉了Mapping技能,一方面增加了经验。
我们只需为Microsoft Visual Studio 2010添加编写NHibernate配置和映射智能提示的功能。只要在下载的NHibernate压缩包里找到configuration.xsd和 nhibernate-mapping.xsd两个文件并复制到C:\Program Files\Microsoft Visual Studio 10.0\Xml\Schemas目录即可。
结语
开始NH剖析的Mapping篇,这篇文章先大体了解下Mapping的方式。根据在群里面的反应情况,在以后我分为两个部分开始介绍Mapping,分别从Mapping映射和ConfORM实战两个角度。
Mapping映射:介绍各种Mapping节点映射,让大家了解下各种Mapping,使用手动编写XML方式。
ConfORM实战:用ORuM思想实现对Domain的映射。
希望本文对你有所帮助。
版权声明:本文为博主http://www.zuiniusn.com 原创文章,未经博主允许不得转载。