ruciffa

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

背景简介

 

我想在很长一段时间内,MS的三个产品将是一个话题吧,也是一个未来方向上的热点。就是将在VS 2008 SP1当中发布的ADO.NET Entity Framework .NET 4.0中将要发布的ASP.NET MVC,以及刚刚推出了2.0版本,并且将一直进化的SilverLight. 前两者将弥补MS产品线上的空白,或者说以前MS产品当中存在着的一些缺陷,而第三个将使MS踏入新的RIA领域.

 

ADO.NET Entity Framework弥补的MS一直都没有介入的持久层技术市场。从背景上来说,持久层框架解决的是关系型数据库和程序模型之间的不匹配性。程序模型更加贴近我们的实际应用,我们需要很多模型来供我们来使用,从而模拟我们的业务逻辑。我们需要程序模型实体之间的封装,多态,组合,继承,多对多等关系。这样的面向对象的与我们日常生活和思考模式匹配的模型才能更好的实现我们的业务。但是我们的数据库却不是面向对象的,数据库是关系型的,它是无法实现面向对象模型当中一些诸如集成和组合的关系的。所以在数据库的发展迟迟没有突破性进展的情况下,我们的选择只能是使用持久层框架来做中间转换,消除数据库和我们程序模型的不匹配性。在java技术平台上,Hibernate作为最为我们常用的持久层框架已经发展了很长一段时间。但在MS技术平台上,除了NHibernate这个模仿品外,一直没有类似功能的框架产生,这对于追求任何技术都最好MADE IN MICROSOFTMS来说,无疑是相当不爽的事情。

 

ADO.NET Entity Framework就是这么一个背景下将要推出的框架。可以说从ADOADO.NET,再到ADOEF MS对于程序和数据库之间的中间层技术完成了从轻量级的工具到重量级的框架的转变,而MS特有的易用性依旧。

 

ADO.NET Entity Framework的组成

 

首先是建模的Schema,用于将程序模型和数据库实际模型通过映射关系连接起来

1. Conceptual SchemaCSDL:用于在程序层面上的建模,直接建立面向对象的各种模型

2. Storage SchemaSSDL:用来描述数据库里面的实际情况。

3. Mapping SchemaMSL:作为前面两个层次的中间层,来描述两者之间的映射关系。

 

然后是提供了对于建模后的数据的访问方式

1. Entity SQL: 改进后的T-SQL语句

2. Object Service:提供了类似于以前在ADO.NET当中使用connectioncommanddata adapterdataset来访问数据的方式,估计要照顾以前开发人员访问ADO.NET的习惯。

3. LINQ TO Entity

 

最后是提供了IDE工具,一个Entity Designer,来方便地创建模型。


LINQ Technology


很多人都认为.NET Framework 3.5其实只是个半成品,真正完成进化的将是4.0, 的确,从3.03.5唯一的加强就是LINQ技术的发布,远远不如当初从2.03.0的变化大,当初引入的让人眼前一亮的WCF, WPF, WWF, Cardspace, ASP.NET AJAX, C# 3.0等技术,相对于以前版本都是相当大的革新。ADO.NET Entity Framework要在SP里面发布,而SilverLight远远没有成熟,ASP.NET MVC还在beta版,可能这些东西完成版本才会在4.0里面集成,现在的.NET Framework 3.5只是一个过渡的产品。

 

谈到唯一的进化 LINQ技术的话,这方面的考虑可能MS是比JAVA领先一步的,以前从来把数据读写当作tool层面的小技术的MS已经开始把其当作VS当中专门的一个模块。现在的LINQLINQ TO Object(内存中数据的读写),LINQ TO XML(XML文件中数据的读写),以及LINQ TO ADO.NET(数据库层面上的读写). LINQ TO ADO.NET又包括了三个子模块,LINQ TO DataSetDataSet数据的读写),LINQ TO SQL(针对于SQL Server数据库的读写),以及LINQ TO Entity

 

LINQ TO Entity其实是直接读写程序模型,它要和ADO.NET Entity Framework配合使用,它读写的是ADO.NET Entity Framework建模出来的程序模型,LINQ TO Entity的本质是直接读写ADO.NET Entity Framework数据的一种访问方式。它忽略了数据库层面,直接访问了程序模型层面。

 

很多人都问过一些问题,比如为什么LINQ TO SQL无法实现继承,多表组合,多对多等关系啊,要怎么实现这些个复杂关系啊。其实从设计上而已,LINQ TO SQL就无法实现这些,真正能够实现这些关系的是ADO.NET Entity FrameworkLINQ to Entity

 

LINQ TO SQL不支持多表继承,包括一实体一具体表的继承体制和一实体一扩展表的继承体制。LINQ TO SQL只支持单表的继承,即用一张数据库表存储整个继承体系中所有实体的数据,简单来说就是按照同一个属性来生成不同的类的那种继承。LINQ TO SQL是一个tool层面上的技术,可以实现轻量级和快速的数据库访问开发。为数据库生成其对应的Entity Class。但是如果你想实现比更复杂的映射关系和继承关系,只能使用预定将要发布的ADO.NET Entity Framework以及LINQ TO Entities

 

ADO.NET Entity Framework并不包括在目前的VS 2008 RTM版本当中,可能会在2008年中作为VSService Pack发布,它是一个ORM层面上的框架,可以实现目前LINQ TO SQL无法实现的诸如Many-to-Many的关系映射,Entity InheritanceSingle Entity From Multiple Tables等更为复杂的关系。

 

两者的不同地方在于,你使用LINQ to SQL的时候,你的映射,产生的CLR/.NET类是和你的数据/数据库模型紧耦合或绑定的,如果你改变对象模型,那么你要直接修改这些类,同样如果数据模型改变,你要使用重新生成对象代码,而ADO.NET Entity Framework在数据/数据库模型上建立一个概念层/实体层,这使得你要先定义概念层/实体层,接着建立数据/数据库的脚本(描述),然后在一个影射层建立你的实体和数据之间的逻辑映射,这使得业务和数据源之间有了很好的藕合度和隔离。而LINQ to SQL无法达到这样的效果,所以LINQ to Entities和ADO EF的联合使用就能提供实体的继承,实体的组合等等

posted on 2008-03-02 16:42  Brandon  阅读(542)  评论(1编辑  收藏  举报