初探Entity Framework4.0
首先我们来看一看Entity Framework的各个重要组件:
EDM
首先来认识一下EDM(Entity Data Model), EDM是Model和数据库之间的桥梁,它描述数据库,Model的构造和它们是如何映射的。EDM减弱了应用程序和底层存储之间的耦合性。
EDM一共包含了三个XML文件,每个文件都有它们各自不同的作用,下面我们详细看一下这三个XML文件:
- CSDL文件
以CSDL为后缀名的文件主要描述了实体类和它们之间的关系。这个文件主要分为两部分,第一部分列出了所有实体类和被Entity Framework管理的这些类之间的关系,第二部分包含了他们之间结构的细节描述。下面是一个CSDL文件的截图:
图中红色部分为实体类和关系的列表,蓝色部分为它们的详细信息。
这个文件的一大特点是可以分离为多个文件,这样就可以很好的避免我们的实体过多使VS设计器难以接受带来的不便。
- SSDL文件
SSDL文件类似于CSDL文件,但它描述的是数据库,同样的分为两部分,第一部分列出了所有的表,视图,存储过程和外键关系,第二部分则详细描述了第一部分所列出的各项,下面是一个SSDL文件的截图:
从结构上来看和CSDL文件并没有太大的不同,但SSDL文件无法像CSDL文件那样分割成若干个文件。
- MSL文件
MSL文件就和前面两个文件有大大的不同了,它是用来抵消Model和数据库之间存在的差异的。这个文件有一个很重要的节点EntitySetMapping, 它把实体类和数据库中的表连结在一起,在一个文件中往往有多个EntitySetMapping节点,这样就保证了一个实体可以映射多张表,一张表也可以映射多个实体。下面是一个MSL文件的截图:
这个文件同样无法像CSDL文件那样分割成若干个文件。
- EDMX文件
当我们用VS的向导自动生成映射信息的时候,我们并无法看到CSDL,SSDL和MSL文件,VS会自动生成一个EDMX文件,这个文件把EDM的三个XML文件合并在了一起,并附加了一些设计器需要的信息,在编译的时候,EDMX文件会分离,CSDL,SSDL和MSL三个文件就会产生了,但我们并无法看到这些文件,要想看见这些文件,我们需要在EDMX文件页面的属性窗口将MetadataArtifact Processing属性设置为Copy to Output Directory,这样我们就可以在bin目录下的debug目录中找到这三个文件。
Object Services
Object Services是用来管理Entity Framework中的实体的,由于Entity Framework主要是用来解决实体类和数据库表之间映射的不对称性,所以对于实体类的管理是有很多工作要做的。当一个查询执行时,Object Services会将查询语句翻译为命令树并传递给下一层的Entity Client. 翻译过程不尽相同,取决于你用了哪种查询语言。如果你用的是LINQ to Entity, LINQ Provider会生成一个表达式树,然后被翻译为命令树;如果你用的是Entity SQL,Object Services会将字符串翻译为另一种命令树传递给Entity Client.
当查询被执行后,Object Services就会根据数据的结构生成对象,这些数据以行和列的形式组织在一起,但并不是以数据库表的行和列形式来组织的,而是以概念模型的形式来组织。例如某一个类中的成员是一个复合对象,这样就可能会形成某一列下面又有很多个列。
context
提到Entity Framework,我们不得不提到context, 通常我们会用ObjectContext类来创建一个context对象,这个对象存在于应用程序和Entity Framework通信的整个生命周期,它为我们对对象模型进行查询操作提供了入口。当一个对象被实现后,它会被加载至context memory中,但这种行为可能会由于性能的原因而被拒绝。在实现过程中,如果要创建的对象已经存在于context memory中,将不会创建新的对象而是返回一个context memory中已存在的对象引用。context memory类似于一个缓存。
状态管理器模块
对象管理器模块能够自动追踪附属于context的对象。它保证了我们对对象的任何修改都能够被正确的管理并且记录在数据库中。状态管理器存储了每一个附属于context的对象的原始数据,让我们可以很方便的和更改后的数据进行对比。
Entity Client data provider
Entity Client负责和数据库之间进行通信,但这一层并不是真正的创建和数据库之间的物理连接,而是倚靠ADO.NET的data provider来实现。
Object Services 通过EDM的概念模型管理对象,Entity Client则利用了EDM中的所有文件。它需要利用映射模型文件(MSL)和存储模型文件(SSDL)来将命令数转换成可供数据库执行的SQL语句,还需要概念模型文件(CSDL)将表格形式的数据库结果转换为概念模型的数据,然后通过Object Services将数据存进对象中。
有时我们会对应用程序的性能有较高的要求,这样我们就可能会跳过Object Services层来直接访问Entity Client,这对性能的提高有很大帮助,它避免了声称对象的过程,这个过程在整个查询过程中是最慢的。但当我们跳过Object Services层来直接访问Entity Client时,就不能够再使用LINQ to Entites,因为LINQ操作的是对象,而这一层对对象却一无所知,所以我们只能利用Entity SQL。
LINQ to Entities和Entity SQL
LINQ to Entities 和 Entity SQL都是Entity Framework中的查询语言,LINQ是对对象进行操作,而Entity SQL是基于字符串的。
Entity SQL远比LINQ to Entities来的复杂,但有些情况下它比LINQ to Entities更加适用:
- 由于Entity SQL是基于字符串的,它更适合于在运行时创建;
- Entity SQL是唯一一种可以直接访问Entity Client层的语言;
- Entity SQL现今已经包含了超过150种方法,很多方法是LINQ to Entities无法调用而Entity SQL却可以调用的。
总结