关于ORM实体映射的感想 (Object /Relational Mapper )

类别:.NET开发 点击:0 评论:0 推荐:

 关于ORM实体映射的感想 (Object /Relational Mapper )

2005-05-29  njbaige/白鸽  于苏州


What  ORM?
Object /Relational Mapper

Why ORM
一般的数据库访问是建立于传统的数据库访问模型的基础之上,
即是Connection,Command等对象,通过SQL语句与数据库交互,并返回结果
现在.NET下面的数据库访问框架已经到了ADO.NET 时代,ADO.NET 的访问方式
详见MSDN的相关文档,这不是本文讨论的重点。但是要说明的是,在.NET 环境
下的数据访问,都得要和ADO.NET打交道,那个是最底层得东西,我们今天谈的
数据库映射框架底层也是基于ADO.NET的访问模式,只是他们进行了很有效的封装
是得对数据库的操作从传统的SQL模式,转换为基于对象的模式。
使业务逻辑与数据层分离,减少之间的藕合性,让系统开发对数据库透明

目前在网络上大家可以找到好几种持久层,其实各个持久层的思想都是相同的,只是在实现的方式上,
还有一些细节功能上有差异,每个持久层都有独特之处或是不足之处

How ORM

实体映射:将数据库中的实体(一般是一张表)映射为类,对数据库的操作就
直接转换为对这些实体的操作:包括新,增,删,改等。采用实体的操作,会使我们对数据
库访问时,更方便,减少很多不必要的代码
关系映射:数据库中多个表之间会有相互的关系,怎样把这些关系也反映到映射好的类中
这就是关系映射,不过相比实体映射,关系映射实现起来更难,这也是评估不同ORM好坏的
一个重要因素
高级查询:在数据库操作中,用得最多的是数据获取(Retrieve)。查询条件也是很多样,会
有关联查询的情况,获取的结果也是要定制的,而不是简单的每个表的所有字段。
这点也是ORM实现最关键的地方,各自实现的方式不同,而且有的用起来也很麻烦,不友好。
感觉还不如直接采用SQL语句来的方便。这点NHibernate继承了Hibernate的长处,采用HQL
查询语言,功能最为强大。其他的ORM 就不是很方便了。个人觉得还有必要保留SQL语句接
口,返回Table对象也是有不错的。

事务处理:在数据可靠性要求很高的时候,需要引入事务。由于ADO.NET 中对事务的支持
很好,所以在ORM实现起来也是很棒的,一般的框架都支持这样的事务。

实体类和操作类的生成: ORM说到底就是帮我们生成了一个功能强大的数据库访问类,
里面包括实体对象类,实体操作类等,实现了这样的思想,在代码生成上也需要友好,方便
才能为大众所用。所以一个优秀的ORM框架需要搭配一个好的代码生成工具。目前一部分框架都有的,
支持直接同数据库连接,选择要生成的数据表,直接生成CS文件,编译成DLL文件,直接导入到工程中就能用啦,
是不是很酷~(不过有的ORM框架需要一些配置文件,也有生成的哦)

数据访问实现方式:对实体对象的获取,更新保存至数据库,在ORM的底层都需要通过
连接来实现(不管是SQL连接还是OLEDB 连接,还是ORACLE连接 ),他们实现的方式也有不同
这决定了我们在代码中的操作方式也不同。一种是通过一个Manage类来实现,就像NHibernate、ORM.NET等,
这样的有点是连接操作效率更高,公用一个连接操作实体,缺点是我们使用起来不是很方便,
不是完全符合对象映射的构想,每次操作都得取找那个Manage,麻烦;还有一种是直接放到实体类中,
也就是每一个实体类中都封装好了Save,del等数据访问方法,要操作直接调用,就不要再去麻烦第三者了~

目前用过几个ORM框架,下面是主要操作方式的学习笔记:
一 . ORM.NET   下载URL:http://www.olero.com/ormweb/index.aspx
一个国外的ORM框架,主要是生成代码工具很酷,才试用的。帮助文件也全,不过为E文的。
启动工具,连接至SQL Server(好像它只支持SQL Server,用的是System.Data.SqlClient )
,显示出数据库中的每一张表和相应的关系,选择要生成的实体对象,配置文件路径和CS类名之后,
代码就出来了。就一个DLL(外带一个连接配置文件,也可以不用,在代码里面赋值就OK)去看了里面的具体内容,
实体映射,事务处理是没问题的,在数据的复杂查询上,采用了自定义的一个查询条件类,
支持很复杂的查询条件(不过感觉开始用起来比较难上手)

二  SmartPersistenceLayer  下载URL;http://www.cnblogs.com/tintown/category/12787.html 
附很详细的帮助文档和实例

简称SPL,最新版本3.1 , 听棠大哥的作品,也是目前国产最棒的ORM映射框架,以郭先尧的Xxmm.Net为基础做的。
(不是帮他打广告,而是里面的功能确实很Cool,不过也有不是很完美的地方-感觉)
支持SQL Server(System.Data.SqlClient)、Access(System.Data.OleDb)、Oracle(System.Data.OracleClient)、
Informix (ODBC连接方式)
  提供“并发处理”、“异构数据库事务处理”、“多帐套”、“实体克隆”、“Top功能”等解决方案。
有代码生成工具 SmartRobot

配置文件:是采用Config/DatabaseMap.xml ,设置数据库的连接参数
O/R Mapping 采用Config/ClassMap.xml ,设置数据库中表字段和实体类之间的对应关系

基本的实体操作 :
实体类继承于EntityObject,具父类为SPL中的一个public abstract类,只要具体的实体类继承后,
实体类就拥有了Save(),Retrieve(),Delete()的实体操作功能,无需借用Manage类来实现

如:
StudentEntity student=new StudentEntity();  //实体化一个学生对象

//以下进行属性赋值
//student.Id=1;                        //此为自动增长,SPL会自动获取

student.No=” 200401”;
student.Name=”张三”;
student.Birthday=DateTime.Parse(“1979-01 -22”);
student.Grade=2;
student.Score=580;
    student.Save();

是不是不用串SQL语句了?

Criteria(标准)操作:对复杂条件的,返回值为实体对象集合的操作
采用几个Criteria(标准)对象实现

RetrieveCriteria(获取标准)
UpdateCriteria (更新标准)
DeleteCriteria(删除标准)

RetrieveCriteria rc=new RetrieveCriteria(typeof(StudentEntity)); //实例化

       Condition c=rc.GetNewCondition();  //实例化一个条件

       c.AddEqualTo(StudentEntity.__GRADE,2);   //二年级条件

       c.AddMatchPrefix(StudentEntity.__Name,’刘’); //匹配’刘’字开头

       c.OrderBy(StudentEntity.__NO);             //按学号排

       DataTable dt=rc.AsDataTable() ;              //以DataTable方式返回


EntityContainer ec=rc.AsEntityContainer();   //以实体集合的形式返回,然后在集合中操作Entity。
有点类似RowCollection

rc.AsEntity();  //返回实体集合中的第一个对象

rc.Top=20;  可以返回前20条记录哦

但是在复杂的表间连接,嵌套查询做得不够,听棠大哥解释的是采用数据库中的视图来完成。
所以我现在对于很复杂的查询,还是采用SQL传递,返回TABLE的方式,这点有待改进。
不过也是所有ORM要面对的难题哦~

三  NHibernate  下载URL:http://nhibernate.sourceforge.net/
国外的一个ORM映射框架。继承了JAVA平台Hibernate的血统,不过功能
有待完善,但应该算是开源的业内最权威的ORM框架了(不知道是不是沾了Hibernate的光~)

操作非常全面,规范。

开发的过程

1.新建一个将要持久化.Net对象的表

2.构建一个需要被持久化的.Net类

3.构建一个可以让NHibernate知道如何持久化对象属性的映射文件

4.构建一个让NHibernate知道如何连接数据库的配置文件]

5.使用NHibernate的API

Nhibernate虽好,但是未提供工具来自动产生schema文件和代码,这是目前比较麻烦的,
完全手写,包括设置表和.Net类的编写,比较郁闷,所以让很多初学者望而却步,或者在观望中。期待很酷的工具能出现

这篇关于 Nhibernate的文章写得很好,我就不罗嗦了,要不大家会砸我滴~
NHibernate快速指南 http://dev.csdn.net/develop/article/63/63977.shtm

据不完全统计,.NET下的ORM 有如下这些,高手们用了发发意见啊~

.NET Persistence BBADataObjects DataObjects.NET Data Tier Modeler for .NET DotNorm Eldorado.NET Enterprise Core Objects (ECO?) Entity Broker eXpress Persistent Objects for .NET FastObjects.NET JC Persistent Framework LLBLGen Pro ModelWorks Nhibernate Nolics.NET Norm Norpheme ObjectBroker ObjectSpaces ObjectSpark Objectz.NET OJB.NET OPF.Net (Object Persistent Framework) ORM.NET Pragmatier Data Tier Builder RapTier Sisyphus Persistence Framework TierDeveloper Bob.NET ObjectPersistor.NET Genome


欢迎交流.net开发经验.
qq: 32660346
msn: [email protected]
Mial:[email protected]

原著文章,如果有转载请告知,谢谢。
大家有好的文章可以发邮件给我,互相学习,共同进步!

本文地址:http://com.8s8s.com/it/it40911.htm