ORM框架VBC#.Net实体代码生成工具(EntitysCodeGenerate)使用

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1引言目前大多数项目或产品都使用关系型数据库实现业务数据的存储,这样在开发过程中,常常有一些业务逻辑需要直接用写SQL语句实现,但这样开发的结果是:遍地布满SQL语句。这些藕合较高的SQL语句给系统的改造和升级带来很多无法预计的障碍。或者说可以使用服务端数据库存储子程序实现,但只是将这种耦合搬迁到后端,问题依然没有根本解决,服务端驻留过多的存储子程序也消耗着服务器的性能并给多人合作维护和更新部署带来许多障碍。为了提高项目的灵活性,特别是快速开发,ORM是一个不错的选择。举个简单的例子:在使用ORM的系统中,当数据库模型改变时,不再需要理会逻辑代码和SQL语句中涉及到该模型的所有改动,只需要将该模型映射的对象稍作改动,甚至不做改动就可以满足要求。ORM的全称是ObjectRelationalMapping,即对象关系映射。它的实质就是将关系数据(库)中的业务数据用对象的形式表示出来,并通过面向对象(Object-Oriented)的方式将这些对象组织起来,实现系统业务逻辑的过程。在ORM过程中最重要的概念是映射(Mapping),通过这种映射可以使业务对象与数据库分离。从面向对象来说,数据库不应该和业务逻辑绑定到一起,ORM则起到这样的分离作用,使数据库层透明,开发人员真正的面向对象。下图简单说明了ORM在多层系统架构中的这个作用。图1ORM在多层系统架构中的作用当然ORM并非是万能的,面对纷繁复杂的业务逻辑,当遇到特别复杂的数据处理及海量数据处理和弥补设计的不足时还应归结到SQL或存储过程来实现,但它却很好的体现了“80/20(或90/10)法则”(也被称为“帕累托法则”),也就是说:花比较少(10%-20%)的力气就可以解决大部分(80%-90%)的问题,这样通过利用ORM框架,我们就仅需要付出极少数时间和精力来解决剩下的少部分问题了,这无疑缩短了整个项目开发的周期。因此快速开发、面向对象和性能优化等必须灵活兼顾才好,这些该工具都提供了很好的解决方案,下文分别作一介绍。2内容2.1ORM框架的实现:VB/C#.Net实体代码生成工具(EntitysCodeGenerate)好的ORM框架工具不仅可以帮助我们很好的理解对象及对象的关系,而且工具本身会帮助我们维护这些关系,帮助我们记住字段属性业务含义并提供辅助的应用等。基于这个理念,我于多年的项目实践和业余时间设计研发了一个基于.NET的ORM工具——VB/C#.Net实体代码生成工具(EntitysCodeGenerate),该工具运行于dotnetframework2.0框架上,适用性广,开发后的代码部署要求不高,在.Net更高版本上也可以很好的运行。VB/C#.Net实体代码生成工具(EntitysCodeGenerate)为ORM提供对象持久、简单对象查询、事务处理等功能。数据持久包括一些对象的Insert、Update、Save、Delete、Select等功能,简单对象查询则提供一些基于对象的简单对象查询GetEntity及构造函数获取对象信息和实体集等。该工具是基于VS.NET2005的开发的应用程序,职责是从数据库中提取数据模型信息并生成实体类代码,帮助开发人员快速映射到关系数据库中的业务数据模型,最优化快速开发。目前直接提供从Oracle、SqlServer、Access、MySQL、Sybase、SQLite、DB2、PostgreSQL、DM(达梦)及支持OleDb连接的数据库和Custom(自定义)类型的数据库中生成VB/C#.Net代码的支持,可以生成实体和实体集的相关代码,并自动提取数据库表和字段的注释说明和对应的数据类型等。另外所生成的代码文件只需修改数据库连接,即可用于目前市场上支持ADO.NET的各种类型的数据库,如Oracle、SqlServer、MySQL、Access、Sybase、SQLite、Excel、DB2、PostgreSQL、Informix、Firebird、MaxDB、DM(达梦)和OleDb、ODBC连接类型的数据库等。所生成代码文件的类关系图如下所示:工具3.x版本之后的实体层代码有个基类(BaseEntity),基类里其实也正是你项目的数据连接的配置位置,该工具实际应用时的配置其实也就在这里,默认为生成代码时所填写的数据库连接信息,并可手工扩展修改(如从config配置文件读取、实现对用户数据库连接信息的加密/解密等;大多数时候我们只需在GetConnectionString()修改数据连接字符串即可):publicclassBaseEntity{publicstaticstringGetConnectionString(){returnUserID=scott;Password=tiger;DataSource=oracle9;//数据库连接设置可修改从别处读取}publicstaticDatabaseTypeGetDatabaseType(){returnDatabaseType.Oracle;//数据库连接类型设置也可修改从别处读取}……}这里可设置该命名空间当前实体下的数据库连接类型及数据库连接字符串,当然也可以修改成从其它如配置文件中读取(以前的版本是放在全局设置DbConnectString这个类里面,这样的缺陷是当一个项目有多个数据库时将不好处理,而现在通过使用基类继承及命名空间划分则很容易解决)。在ORM实现的前期工作中,为了实现屏蔽各种数据库之间的操作差异,我们需要定义数据操作公有接口,封装基本的数据库增、删、改、查等操作。以数据库Oracle的为例介绍,我们需要定义下层各种数据库操作的公共组件:namespaceSystem.Database{publicclassDbCore:IDisposable{……publicintExecuteNonQuery(DBCommandWrappercommand){…}publicDataSetExecuteDataSet(DBCommandWrappercommand){…}……}}再定义数据库操作类及数据库的基类等,实现各种数据库类型的操作。publicabstractclassDBCommandWrapper{……}internalabstractclassDatabase{……}……然后实现各种数据库的操作类,以Oracle为例internalclassOracleDatabase:Database{…}publicclassOracleCommandWrapper:DBCommandWrapper{…}最后在生成的实体类及基类文件中生成相应的数据库Insert,Update,Delete,GetEntity,Save等操作和类型映射代码如下所示:publicintInsert(){ORMapBaseEntityormap=newORMapBaseEntity(this);DEPTentity=newDEPT();returnormap.Insert(entity);}……publicstaticSystem.Data.DbTypeGetDBTypeByFullName(stringstrTypeFullName){switch(strTypeFullName){caseSystem.Byte:returnSystem.Data.DbType.Byte;caseSystem.Boolean:returnSystem.Data.DbType.Boolean;……}}在生成代码的同时,工具自动添加实体类的属性标示及字段注释说明等如下所示:[Serializable(),Description(Primary:DEPTNO)]publicclassDEPT:BaseEntity{……///summary///主键DEPTNO////summary[DataObjectField(true)]publicintDEPTNO{set{_deptno=value;}get{return_deptno;}}///summary///DNAME////summary[DataObjectField(false)]publicstringDNAME{set{_dname=value;}get{return_dname;}}……}实体中的summary中的注释自动将数据中表及字段的注释说明提取到这里,方便程序员在代码编写及维护中交流使用,理解其所对应的业务含义。示例是以Oracle数据库自带的示例库为例介绍的,数据库自带的实例库scott/tiger表注释为空,注释则以字段名代替。在这里可这样理解一张表对应一个实体类,表中的一条记录对应类的一个实例。实体定义完成后,我们需要根据实体类中绑定的属性构造出运行期间需要的SQL语句,收集实体类定义中的数据结构描述,再定义一个类来说明实体在运行期间所引用到的所有关于数据持久的信息,包括关键字字段,一般字段等等。同时需要一个字段的元数据字段在数据库中的名称,大小,是否可为空,列类型等信息。这些条件具备后,再定义解析类,负责转换数据的程序类型到数据库字段类型,并且构造出Insert,Update,Delete,Select,Save等操作所需要的SQL语句,再去调用数据操作公有接口(DbCore,支持自定义SQL语句、存储过程和事务处理等),即可实现。同时数据操作公有接口System.Database.DbCore结合实体类可将简单和复杂及事务的操作更为方便的实现,下文着重介绍在实际中的使用。数据库操作默认以实体对应表的主键为准,当然也可以指定条件;并引入保存操作,即将增加和更新合并为一个保存操作,由实体对象本身自己根据主键或指定条件判断是增加还是更新操作。2.2在开发中的实际应用VB/C#.Net实体代码生成工具(EntitysCodeGenerate)安装后,在生成对应的实体代码后都会有个“相关配置”文件夹,里面有“配置说明”文档和相关文件,实际使用时只须按“配置说明”文档操作即可。使用该工具开发的项目,可以做到很好的切换到异构数据库,且只需变动数据库连接接口即可(即只须修改GetDatabaseType()/GetConnectionString())。同时提供了ORMaping.dll(1.0版本引用),System.Database.dll(2.0/3.0/3.x/4.x版本引用)安装目录下有相应的chm格式帮助文档,是对这两个dll单独使用的说明,支持自定义的数据库访问,并可结合生成的实体操作数据库,提供良好的事务处理等。其中ORMaping.dll支持Oracle;System.Database.dll默认支持Oracle,并可用于各种类型的数据库访问,如SqlServer、MySQL、Sybase、DB2、SQLite、PostgreSQL、Informix、Firebird、MaxDB、DM(达梦)、OleDb、Odbc等,对没有直接提供的数据库类型可使用OleDb或Odbc连接。工具所生成的代码和提供的文件,都是可选配的,可单独使用也可配置使用。实体代码的生成界面比较简单,如下所示:这里,只须选择数据库类型、输入正确的数据库连接字符串(Custom(自定义)的数据库类型填写正确自定义程序集信息)、代码文件的输出目录和代码命名空间即可。实体数据类型以”数据类型映射文件”为准,工具提供了系统默认的类型映射,若有自定义的数据类型,在”数据类型映射文件”里修改,可配置到数据类型的精确刻度。数据类型初始值在”数据类型初始值文件”里修改,没有配置的取.Net默认值。若修改过程中想恢复默认的配置,只须点击”生成”按钮即可(注意不同语言的类型定义可能有所差异,注意区分。如:C#的byte[],在VB中的定义为byte())。准备工作做好后,单击”生成代码”按钮即可(若不想全部生成,单击”选择生成”按钮)。生成成功之后按提示生成的配置说明文档,将实体代码文件和基类文件拷贝到指定目录,并按生

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功