MVC5+EF6 入门完整教程8_1:实体数据模型
实体数据模型 (EDM) 使用三个关键概念来描述数据结构:“实体类型”、“关联类型”和“属性”。 在任何 EDM 实现中,这些都是描述数据结构的最重要概念。
实体类型
实体类型是用于描述实体数据模型中数据结构的基本构造块。实体类型都是从属性构造而来的,描述了顶级概念的结构,如业务应用程序中的客户和订单,实体类型也是实体的模板。 实体表示一个特定对象(例如特定的客户或订单)。 每个实体都必须在某个实体集中具有一个唯一的实体键。 实体集是指特定实体类型的实例集合。 实体集(及关联集)都是按逻辑分组在实体容器中。
实体类型支持继承功能:即一个实体类型可以从另一个实体类型中派生。 有关更多信息,请参见实体数据模型:继承。
关联类型
关联类型(也称为关联)是用于描述实体数据模型中关系的基本构造块。 在概念模型中,关联表示两个实体类型(例如 Customer 和 Order)之间的关系。 每个关联都有两个关联端,用于指定关联中所涉及的实体类型。 每个关联端还会指定关联端重数,用于指示位于关联端的实体数。 关联端重数的值可以为“一 (1)”、“零或一 (0..1)”或“多 (*)”。 通过导航属性或外键(如果实体类型上有)可以访问关联某一端的实体。
在应用程序中,关联实例表示特定的关联(例如 Customer 实例与 Order 实例之间的关联)。 关联实例按逻辑分组在关联集中。 关联集(及实体集)都是按逻辑分组在实体容器中。
属性
实体类型包含用于定义其结构和特征的属性。 例如,Customer 实体类型可能具有 CustomerId、Name 及 Address 这样的属性。
概念模型中的属性类似于对计算机程序中的类所定义的属性。 与类的属性定义了类的形状并携带了有关对象的信息相同,概念模型中的属性定义了实体类型的形状并携带了有关实体类型实例的信息。
属性可以包含基元数据(例如字符串、整数或布尔值)或结构化数据(例如复杂类型)。 有关更多信息,请参见实体数据模型:基元数据类型。
概念模型的表示形式
“概念模型”是某些作为实体和关系的数据结构的特定表示形式。 概念模型的一种表示形式是图表。 下图用三个实体类型(Book、Publisher 和 Author)以及两个关联(PublishedBy 和 WrittenBy)来表示概念模型:
PublishedBy 关联的关联端是 Book 和 Publisher 实体类型。 Publisher 端的重数为“一 (1)”,Book 端的重数为“多 (*)”,表明一个出版商可以出版很多书,而一本书只能由一个出版商出版。
实体键(实体数据模型)
“实体键”是用于确定标识的实体类型的一个或一组属性。 构成实体键的属性是在设计时选择的。 实体键属性的值必须在运行时唯一标识实体集中的实体类型实例。 在选择构成实体键的属性时应确保实例在实体集中的唯一性
下面是将一组属性用作实体键的要求:
-
实体集中不能存在两个相同的实体键。 也就是说,对于实体集中的任意两个实体,构成一个键的所有属性的值不能全部相同。 但是,构成实体键的部分(而不是全部)值可以相同。
-
实体键必须由一组不可为 null 且不可变的基元类型属性组成。
-
构成给定实体类型的实体键的属性不可更改。 对于某个给定实体类型,不能允许存在多个可能的实体键;不支持代理键。
-
当实体位于继承层次结构中时,根实体必须包含构成实体键的所有属性,并且必须在根实体类型上定义实体键。
三个实体类型的概念模型:Book、Publisher 和 Author。 构成其实体键的每个实体类型的属性均用“(Key)”标示出来。 请注意,Author 实体类型有一个包含两个属性(Name 和 Address)的实体键。
实体类型(实体数据模型)
“实体类型”**是用于描述实体数据模型 (EDM) 中的数据结构的基本构造块。 在概念模型中,实体类型表示顶级概念(例如客户或订单)的结构。 实体类型是实体类型实例的模板。 每个模板都包含以下信息:
在应用程序中,实体类型的实例表示一个特定对象(例如特定客户或订单)。 实体类型的每个实例在某个实体集中都必须具有一个唯一的实体键。
对于两个实体类型实例,仅当其类型相同且其实体键的值也相同时才认为是相等的。
外键属性(实体数据模型)
实体数据模型 (EDM) 中的“外键属性”**是某个实体类型的一个或一组基元类型属性,其中包含另一个实体类型的实体键。
外键属性相当于关系数据库中的外键列。 关系数据库中的外键列用来在表中的行之间建立关系,同样,概念模型中的外键属性用于在实体类型之间建立关联。 当两个实体类型中有一个类型具有外键属性时,将使用引用完整性约束来定义这两个实体类型之间的关联。
Book、Publisher 和 Author。 Book 实体类型有一个属性 PublisherId,当您为 PublishedBy 关联定义一个引用完整性约束时,它将引用 Publisher 实体类型的实体键。
导航属性(实体数据模型)
“导航属性”**是实体类型上的可选属性,它允许从关联的一端导航到另一端。 与其他属性不同,导航属性并不携带数据。
导航属性定义包含以下信息:
-
名称。 (必需)
-
导航属性要导航的关联。 (必需)
-
导航属性要导航的关联端。 (必需)
请注意,对于关联各端的两种实体类型,导航属性都是可选的。 如果对关联一端的某实体类型定义导航属性,则不需要对关联另一端的该实体类型定义导航属性。
导航属性的数据类型由其远程关联端的重数决定。 例如,假设导航属性 OrdersNavProp 存在于 Customer 实体类型上并导航 Customer 与 Order 之间的一对多关联。 因为导航属性的远程关联端的重数为多 (*),所以其数据类型是一个集合(属于 Order)。 同样,如果导航属性 CustomerNavProp 存在于 Order 实体类型上,但由于远程端的重数为“一 (1)”,所以其数据类型应为 Customer。
示例
下图显示了一个具有三个实体类型的概念模型:Book、Publisher 和 Author。 导航属性 Publisher 和 Authors 都是在 Book 实体类型上定义的。 导航属性 Books 是同时在 Publisher 实体类型和 Author 实体类型上定义的。
引用完整性约束(实体数据模型)
实体数据模型 (EDM) 中的“引用完整性约束”与关系数据库中的引用完整性约束类似。 与数据库表中的一个(或多个)列可以引用另一个表的主键相同,实体类型的一个(或多个)属性可以引用另一个实体类型的实体键。 所引用的实体类型称为约束的“主体端”。 引用主体端的实体类型称为约束的“依赖端”**。
引用完整性约束定义为两个实体类型间的关联的一部分。 引用完整性约束的定义指定了以下信息:
-
约束的主体端。 (一个实体类型,其实体键由依赖端引用。)
-
主体端的实体键。
-
约束的依赖端。 (一个实体类型,它的一个或多个属性引用主体端的实体键。)
-
依赖端的一个或多个引用属性。