1.Entity Framwwork体系结构图
Entity Framework的体系结构主要包括:EDM元数据、Entity Client、Object Services和ADO.NET Provider四部分。其中EDM是整个Entity Framework框架实现ORM最核心的部分。下面的章节会对图中Entity Framework的体系结构逐一进行介绍。
2.EDM
EDM(Entity Data Model)译为实体数据模型,它主要的作用是能够将数据库中的对象(表、视图、存储过程等)映射为C#中的实体类,从而实现操作实体类就等同于操作数据库对象。
EDM的组成结构包含:CSDL(概念层)、SSDL(存储层)、对应层(MSL)。
CSDL:是EDM最核心的部分也叫作概念模型。在创建Entity Framework后会根据数据库中的对象(表、视图、存储过程等)生成实体类,CSDL对应的就是这些实体类的描述信息。
SSDL:描述数据库对象(表、视图、存储过程等)的信息,也就是将数据库中的对象信息加载到了Entity Framework中,并描述数据库对象的结构信息。
MSL:负责CSDL(概念层)和SSDL(存储层)的映射关系,根据MSL的映射信息可以将实体类映射为数据库中的具体对象,这样就可以知道我们在操作某个实体类时对应到数据库操作的是那个对象(表、视图、存储过程等)。
对应映射方式如图:
另外在Entity Framework项目中,图中的三部分内容以一个XML定义并描述其中的信息,该信息存放在名为.edmx后缀的文件中。
3.Entity Client
我们知道ADO.NET操作数据库会有一套核心类库来实现,其中包括Connection、Command等,同样Entity Client模拟了ADO.NET实现了这些核心类库来对数据库操作。ADO.NET的核心操作类库是向数据库发送SQL来实现操作,而Entity Client是向EDM发送Entity SQL操作实体。我们可以总结理解:Entity Client模仿了ADO.NET核心类库从而实现了对数据的操作能力。
4.Object Services
简单来理解就是我们在使用实体类处理数据使用的方法。通常在操作Entity Framework实体对象时会两种方法:SQO(标准查询运算符方法)、LINQ。
如图:
图中的代码片段分别使用了SQO(标准查询运算符方法)和LINQ两种方法来操作实体对象,这种可以操作EF实体对象来实现数据操作的方法可以理解为Object Services。
5. ADO.NET Provider
不管EF有多少种体系结构最终处理后都要和数据库进行打交道(访问)。而负责与数据进行访问的就是ADO.NET Provider来完成的。上述的Entity Client虽然也和ADO.NET有过关系,但是Entity Client只是模拟ADO.NET对数据的操作方式,并生成操作命令。ADO.NET Provider会将Entity client的操作命令翻译为数据库的SQL语句来对数据库进行执行。
通常ADO.NET Provider对数据库的访问还必须有数据库厂商提供的插件进行支持,VS默认并仅仅实现了对SQL Server的访问提供。如果需要使用其他的数据库来实现Entity Framework 还需要单独去对应的数据库厂商下载单独的数据访问插件来实现。
6. edmx文件
在项目中创建Entity Framework框架后会在项目中生成一个edmx后缀的文件,展开文件结构如图:
6.1.edmx文件XML信息
Edmx文件默认打开是一个图形化的界面描述了实体的模型信息,要以XML文件的方式打开需要对文件进行右击,在弹出的快捷菜单中选择“打开方式”选项,可弹出如下界面:
在该界面中选择“自动编辑器选择程序XML”单击确定按钮打开,打开后如图:
从图中可以看到XML中包含了SSDL、CSDL、CS mapping三种类型的节点,三个节点分别对应了EDM中的存储层、概念层、对应层。该文件是Entity Framework实现ORM的关键配置文件。
SSDL节点内容
从XML节点的内容来看就可以理解SSDL的概念,SSDL中包含了数据中所有对象并将所有对象以XML结构进行展示,从XML的节点和属性的定义来看SSDL完全描述了数据库中的信息。
CSDL节点内容
CSDL节点下的内容描述了实体类的各种信息,结合SSDL的内容可以看出每个项目在CSDL中都有一个一一对应的关系。
CS Mapping节点内容
根据CS Mapping节点内容EF底层可以弄清每个实体类对应到数据库中关系信息,从而实现数据库的操作。
6.2.实体文件
在倒数第一个后缀名为tt的文件展开后,可以获取到数据库所有对象(表、视图、存储过程等)对应生成实体类,这块的实体类是和数据库中的对象一一对应的。
结构参考如图:
6.3.数据上下文类
扩展名为“.Context.cs”的类为数据上下文类,展开“.Context.tt”文件可以找到该文件。
数据库上下文类中将所有实体类作为了自己成员,我们对数据实体的的所有操作都需要该类来完成。简单的理解“数据上下文类”,它就相当于一个数据库的管理者,通过该来完成所有对数据的操作。
从上下文类中包含的信息可以看出,数据表变成了属性、存储过程变成了方法。