Entity Framework概述 For 终结者

Entity Framework也算是ORM(Object-relationalMapping)工具的一种,和NHibernate是一类东西,简单说就是把数据库中的关系数据操作方式变成面向对象的操作方式,弥补面向对象模型与数据库中关系数据类型之间的鸿沟。据说NHibernate的配置和使用很复杂,我没有用过,不好妄下定论,终结者有经验,可以简单说说,呵呵。

这系列文章,重在使用。大量概念性的和深层次的内容,可以先从MSDN的相关信息中了解。这里只说一些实际应用涉及到的概念和内容。用到什么,说什么。

1.    为何需要ORM

开发技术发展了这么多年,除了数据库的主流还是关系型数据库之外,其他的开发技术的主流都已经是面向对象了。我们可以用面向对象技术去分析需求,去进行系统设计,去实现系统的各种逻辑和功能,然后,当数据需要保存到数据库时……面向对象无能为力了,因为我们面对的是关系型数据库,一切只能通过SQL语句来操作,面向对象在关系型数据库的世界里是个传说。因为从理论上说,面向对象技术无法彻底贯穿从分析阶段到数据持久化(数据库存储和获取)阶段的每一个方面,我们需要一种工具和手段,使数据持久化这最后一公里也面向对象化。当前面向对象的数据库还远未达到大规模实用阶段,因此从数据库本身的层次上,是没有办法面向对象的,因此就想到一个办法,就是增加一个ORM层,将数据库中的对象映射为代理对象,我们利用面向对象的方法操作代理对象,代理对象帮助我们完成实际的数据操作。ORM的存在使我们可以利用面向对象技术来进行数据持久化。当然了,如果我们根本不需要,或者不想用用面向对象的方式去持久化数据,那么也根本就不需要什么ORM了。

2.    为何使用Entity Framework

用ORM实现面向对象的数据持久化(持久化在这里包括存储和获取),我们操作的是ORM提供的代理对象,通过它实现我们的持久化工作,这就存在一个代理对象可以在多大程度上满足我们对关系型数据库所进行的操作的问题,比如我们可以很容易的用SQL语句做各种Join操作,Group分组操作,Select指定的几个列,各种主子表的Insert、Update、Delete,等等。那用ORM我们可以同样容易的完成等价的操作吗?其配置和使用起来足够容易吗?

我没有用过NHibernate,而且听说很麻烦,很复杂,所以都没有去尝试,本来我也是不准备用什么ORM工具的,因为我觉得ORM还不够成熟,处理一些简单的单表无关联操作还行,复杂的东西处理起来不好用,而现实项目中除了一些基础设置的功能,其数据库操作基本上是单表的简单操作外,其他的数据库操作都比较复杂,涉及到大量的表关联,列筛选,分组、等等复杂集合操作。这些都不是目前的ORM的强项,就算能实现,也格外复杂吧(我猜是这样)。另外,如果数据库数据模型发生变化,还需要同步ORM中的相关对象,又是一笔额外的负担,尤其是数据库大改的话(上帝保佑不会有那么一天)。这种种原因,促使我一直没有染指ORM。

来到现在这个公司后,公司中的项目使用了自行开发的一套ORM工具,而我由于各种恰巧的仿佛事先安排好的原因,并没有太多参与到这个项目中,参与的只是其中比较独立的部分,同时,也使我开始审视是否有不错的ORM可以用,于是Entity Framework(以后简称为EF),这个生于.NET 3.5 SP1的东西映入我的眼帘。作为微软的铁杆粉丝,如果要用ORM,自然先用用微软自家的再说,而且,总体来说,微软的公司有一个基本共同的特点就是简单易用,并配有强大的设计器(当然,缺点就是开放性比较低,基本上只限制于与微软自家的产品,Windows、Sql Server等有良好的“合作”关系),另外,作为大部分从数据库结构反向到面向对象层次的现实来说,EF提供了比较方便的能力,可以从数据库中生成和更新概念模型(概念模型是什么?且听下面(不是下回)分解),从而一定程度上解决了与数据库结构同步的问题,至少比要纯手工同步好一些。

3.    Entity Framework中的概念

要了解EF中的一些基本概念等,最好的信息当然是来自于MSDN了。简单说,要想让EF发挥作用,需要了解组成它的三个基本概念,即:

l  概念架构定义语言(ConceptualSchema Definition Language,简称CSDL)

l  存储架构定义语言(StoreSchema Definition Language,简称SSDL)

l  映射规范语言(MappingSpecification Language,简称MSL)

说是三种语言,其实就是三组XML定义的描述。

3.1 概念架构定义语言(ConceptualSchema Definition Language,简称CSDL)

理论上的ORM,首先需要一套定义,这套定义用面向对象的概念去描述需要进行持久化的对象,比如,我需要持久化一个订单,那么就需要一套定义,定义一个订单主信息对象和订单明细对象,然后订单主信息对象中有一个集合属性,其类型是订单明细对象。这套定义在EF中就是“CSDL”描述的,它定义我们需要持久化操作的对象定义,注意,它和具体的数据库存储是没有关系的,就是说它只定义我们需要持久化的对象的对象结构,而不关心将来要存储到Sql Server还是Oracle还是其他什么具体数据库。

3.2 存储架构定义语言(StoreSchema Definition Language,简称SSDL)

既然作为持久化方案,自然需要一套定义,定义我们需要的数据,具体来自于哪种数据库的什么地方,其结构是怎样的,外键关系是怎样的等等,这就是SSDL定义的内容。有了这套定义,EF就有足够的信息知道将来数据将如何具体地存储到以及获取自何处。

3.3 映射规范语言(MappingSpecification Language,简称MSL)

EF有了对象定义,有了具体存储结构的描述,还缺什么呢?还缺一个CSDL与SSDL两者之间的一种“映射”,即,CSDL中定义的一个对象的某个属性,应该映射到SSDL中的哪个表的哪个字段,以及,CSDL中定义的一个对象之间的关联,应该对应到SSDL中的哪个外键关联(这种外键可以是数据库中真正的外键,也可以是只在SSDL中定义的“外键”)?诸如此类的映射关系,通过MSL定义出来。

 

有了以上三组定义,EF就有足够的信息为我们提供服务了。以上三组定义,可以分别在单独的文件中存放(分别以CSDL,SSDL,MSL作为后缀名),也可以合并到一个文件中(以.EDM后缀名)存放。如果我们使用VS提供的EF设计器,那么三组定义将合并到一个.EDM文件中存放。三组定义的格式,并不很复杂,但是如果打开一个现有的.EDM文件,可能还会看到满屏幕的XML觉得很复杂,很麻烦。没关系,我们通常需要的功能,利用VS提供的EF设计器就可以很好的解决,通常不需要手工查看和编辑这些XML格式的定义。作为实用主义,我们先从简单实用起步。

posted on 2010-04-07 09:09  零度的火  阅读(314)  评论(0编辑  收藏  举报

导航