NHibernate已经足够了吗?
【IT168 技术文档】
在2004年的时候,我写了一个数据层代码(基于O/R Mapping)自动生成工具XCodeFactory,其支持Ole、SqlServer和Oracle,我一直完善、改进、维护它到2006年初。并且在博客园开了一个专栏写了一系列的文章来介绍如何使用它。到2005年后半年的时候,国内类似的代码生成工具已经开始“泛滥”了,O/RM一下子流行起来。在2005年底,我开始关注NHibernate,并逐渐转移到NHibernate上面来,对XCodeFactory的依赖也越来越小了。毕竟,NHibernate是如此得强大,以至于我不再需要XCodeFactory。
但是,对于经常要编写数据库访问代码的.NET开发人员而言,拥有NHibernate就已经足够了吗?我认为是不够的。NHibernate在基于对象方面做得非常好,这也是它初始的目标,它非常出色地实现了这个目标。但是在O/RM之外了?比如,我们需要进行批量的更新、删除等,使用NHibernate进行类似的操作不仅繁琐而且效率低下。当然,这些内容不是NHibernate的职责,NHibernate也不用关心这些O/RM之外的东西。但是,我们也许都知道了,NHibernate需要另外一个工具来作为有力的补充,这个补充主要基于关系、而不是对象来操作数据库中的数据。
有人选择了EnterpriseLibrary中的数据访问Block作为O/RM之外的补充,这很不错。而DataRabbit是另外一个选择。
相信来我blog的朋友都一定知道ESFramework,ESFramework源于EnterpriseServerBase类库的Network命名空间,而DataRabbit来源于EnterpriseServerBase类库的DataAccess命名空间,EnterpriseServerBase.DataAccess也是XCodeFactory核心库。DataRabbit中包含多个基于关系的数据访问接口,并且内置了对SqlServer、Oracle、Ole的支持,如果要支持其它类型的数据库,只需实现相应的接口即可,并且可以插件的形式提供。
那么,目前的DataRabbit封装了哪些功能了?下面是DataRabbit提供的核心功能的列表(将不断补充):
(1)简化通常的数据访问,体现在IADOBase接口,IADOBase接口和以下所有接口均独立于数据库类型。
(2)数据分页 IPagerManager
(3)事务 Transaction
(4)分布式事务 Distributed
(5)操作数据大纲(DataSchema) IDataSchemaOperator ,比如获取某个表的大纲结构(Column信息、主键信息、外键信息),依据大纲在指定的数据库中创建表
(6)数据库适配器插件 IADOBaseAddin
(7)简单数据迁移 SimpleDataTransfer
这些接口将在后面的系列文章中逐一介绍。下面也看一个分页的例子,来点感性的认识。这个例子是从Student表中找出所有年龄大于20的学生记录,并对这些记录进行分页显示,PageSize为100。
//通过工厂获取IADOBase
IADOBase adoBase = ADOBaseFactory.CreateADOBase(dbAddress) ;
//分页参数
PagerParameters paras = new PagerParameters("Student" , "ID" ,"Where Age > '20'" ,100) ;
//从IADOBase获取分页管理器
IPagerManager pagerManager = adoBase.GetPagerManager(paras) ;
//获取第pageIndex页
int pageIndex = 0 ;
DataTable page = pagerManager.GetPage(pageIndex) ;
//显示数据到DataGrid
this.dataGrid1.DataSource = page ;
