本文分析 Entity Framework 从数据库自动生成的模型文件代码(扩展名为 edmx )。
本文使用的数据库结构尽量简单,只有 2 个表,一个用户表和一个分公司表(相当于部门表),一个用户必须属于一个分公司,因此用户表有一外键关联到分公司表。数据(实体)模型如图 1 。
图 1 数据模型
以文本方式打开 .edmx 文件,可以看到这是一个 xml 文件,根结点下包括 2 部分内容,如图 2 所示。
图 2 整个文档由 2 大部分组成
图 2 中,第一部分为
接下来重点分析 Runtime 结点,展开此结点,可看到包括 3 部分,存储模型(或者物理模型) StorageModels 、概念模型 ConceptualModels 和映射 Mappings ,如图 3 所示。
图 3 Runtime 的 3 大组成部分
下面来逐个分析 Runtime 的这三个部分。
StorageModel 下面只有一个子结点 Schema 。在 Schema 下面包括 3 部分内容,分别是实体容器 EntityContainer 、实体类型 EntityType (每个实体都生成一个这样的结点),关系 Association (数据库的每个外键关系都生成一个这样的结点)。如图 4 所示。
图 4 Runtime.StorageModel 内容
EntityContainer 里面的内容如下。
图 5 Runtime.StorageModel.EntityContainer 内容
从图 5 可以看出, EntityContainer 列出了存储模型中包括的实体和关系。
再来看 EntityType 结点的内容。这个结点对应于一个数据库表,对应于一个实体。数据库中有多少表,就生成多少这样的结点。下面以 SystemUser 为例(因为这个表有外键)看结点的内容,如图 6 所示。
图 6 Runtime.StorageMode.EntityType 结点内容
从图中可以看出, EntityType 结点主要内容就是列出了表中各个字段,并没有反映外键关系。外键关系是在后面要分析的内容中表示的。
下面再来看 Association 结点内容。这个结点对应数据库的一个外键关系,每一个外键都生成一个 Association 结点。本例中,外键为用户到分公司,结点内容如图 7 所示。
图 7 Runtime.StorageModel.Association 结点内容
从图 7 可以看出, Association 结点首先定义了外键关系的双方以及重数,接下来定义了主键表、列和外键表、列。
到此为止,物理模型 StorageModel 已经分析完毕。
对于自动生成的实体模型来说,概念模型与物理模型的内容是一致的。概念模型结构如图 8 所示。
图 8 概念模型 Runtime.ConceptualModels 结构
从图 8 可以看出, Runtime.ConceptualModels 结构与 Runtime.StorageModels 结构是完全一致的,如果展开各个子结点就会看到,内部的结构也是一致的,在此就不再一一分析。
映射指的是物理模型到概念模型的映射。这部分内容比较简单, Mappings 结点下面有一个 EntityContainerMapping 结点,再下面对每个实体生成一个结点 EntitySetMapping ,其中对每一列(属性)都进行了映射。如图 9 所示。
图 9 映射 Runtime.Mappings 结构
版权所有:基础软件。作者邮箱:[email protected]。本文首发于 http://www.cnblogs.com/FoundationSoft。文章转载请保持此版权信息并注明出处。