msdn 杂志7月刊
本文地址:http://msdn.microsoft.com/magazine/54b90ec9-3f0c-44db-ab61-dd00ba473441
Who Needs Another New Query Language?
最后一个关心的问题是开发edm为什么要创造一种新的查询语言?为什么不采用现有的一种呢?在我稍微深入edm,答案一会儿就会变得非常清晰。到目前为止我介绍的主要关于为什么edm被创建以及edm的组成,事实上他是实体关系模型上是一脉相承的。创建一个模型不仅仅要能清晰地映射基础存储数据而且要代表应用程序域模型。Edm需要有能力建立概念模型如继承,多态。当前的查询语言没有支持基于继承和关系或者返回多态的数据集,新的查询语言必须满足这些需求。
因此诞生了Entity SQL (Esql),一种新的sql方言拥有了这种以前的sql方言不支持的查询能力。ESQL扩展了现有的sql就如同edm扩展了许多数据库中的关系模型。此外ESQL的语法不局限于模型背后具体的数据库,查询一旦被写,就和背后数据库无关。下面的例子,我们看一个简单的esql查询例子将获得所有blog至少发过一个博客帖子的人。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Implementing the EDM
ADO.NET Entity Framework是由ado.net演变而来,并且edm的执行提供了一个更高水平的抽象比开发一个关系数据库。在1.0版本中,开发小组曾专注于建立一个平台不仅仅是一个简单的orm,它要求允许开发者能对概念模型和对象模型进行非常灵活的映射并且有能力容纳来自基础存储数据高度的分歧。
基础存储数据的高度灵活和分歧是将数据库和应用程序分离的关键,当数据库发生改变,由于应用程序被实体框架分离,所以你不要修改应用程序,只需简单地更新映射文件,如果有必要,则与变化同步。
图4 ADO.NET Entity Framework Architecture
如图4 实体框架是建立在现有的ado.net2.0 provider模型,通过轻微的更新,以支持实体框架和ado.net 3.5的功能。图中框架包含架构定义语言(csdl), 映射架构的语言,和存储架构定义语言( ssdl ) 。还注意到,该实体的框架内,包括最新的ADO.NET中的SqlClient数据提供支持的典型命令树。
EntityClient
Entity Framework提供了一个新的Ado.net provider—entityClient.它和我们以前使用的ado.net provider非常相似,它提供抽象地允许开发者在edm中使用标准Connection, Command, 和 DataReader对象来执行查询,同时它还添加了附加的EntityClient视图引擎所需的映射域模型。当需要对实体以行和列的形式进行查询时,Entityclient可以使用ESQL查询语句而不用构造类级别的概念架构。如果看到下面entityclient在图5中的使用,你可以看到我通过创建entityCommand来引入查询语句,然后entityCommand在edm中执行,查询文本由EntityCommand解析并由cct创建。
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
图5 Use of ESQL to Query against EntityClient
当定义一个从EntityClient视图引擎的映射在edm和数据库结构之间转换,有许多不同的选择。映射指定用一个声明的xml语法--映射定义语言(MSL),它可以使用实体映射工具通过手动去创建和编辑xml代码
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
图6 MSL—EntitySetMapping Example
当编译之后,msl允许entityframework生成需要的查询并且更新在EntityClient
视图引擎中定义的用来完成从edm到逻辑存储结构转换的查询视图。一个替代描述视图的方法使用ESQL查询。
如果那样的话,当开发人员使用ESQL来表达查询视图,需要他们在映射文件中定义好相应的添加,删除,修改。由于一般的映射文件是无法为查询视图生成更新视图所以在查询视图里就赋予ESQL权利,使其为那些没有效更新视图重新定义视图成为可能。