实现实体 (EDM)
在所有 实体数据模型 (EDM) 应用程序中,实体都在概念架构定义语言 (CSDL) 中定义并映射到元数据,这些元数据以存储架构定义语言 (SSDL) 描述数据结构。本示例演示单个实体的设计以及如何将其映射到存储。
此示例实体所面向的应用程序定义有关企业中员工的信息。
概念架构
以下面的概念架构定义语言 (CSDL) 语法定义的实体包含名为 Employees
的 Namespace 中某个数据类型的规范。Namespace 包含一个 EntityType 声明:Employees
。
Employees
实体的属性包含用于标识员工的基本信息。EmployeeId
属性声明为 Guid,用于唯一标识此类型的实例。EmployeeId
属性标记为 Key(键)。
其他三个属性通过 FirstName
、LastName
和 Email
地址标识此员工。
除了实体规范之外,CSDL 架构还包含 EntitySet 和 EntityContainer 声明。EntityContainer 和 EntitySet 规范定义数据模型中数据类型的范围。EntityContainer 包含 EntitySet。在此示例中,名为 Employees
的 EntitySet 包含 Employee
类型。
<?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees" Alias="Self" xmlns="https://schemas.microsoft.com/ado/2006/04/edm">
<EntityContainer Name="EmployeesContext">
<EntitySet Name="Employees" EntityType="Employees.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="Guid" Nullable="false" />
<Property Name="LastName" Type="String" Nullable="false" />
<Property Name="FirstName" Type="String" Nullable="false" />
<Property Name="Email" Type="String" Nullable="false" />
</EntityType>
</Schema>
Namespace 架构包含 Employee
实体和除 EntityContainer(独立于架构 Namespace)之外的所有集。有关 EntityContainer 的更多信息,请参见 EntityContainerMapping 元素 (MSL)。
在此数据模型之上生成的应用程序引用 Namespace 以使用在此模型之上生成的类。
这一 CSDL 规范称为概念架构或设计架构。以 SSDL 语法表示的存储元数据中的并行实体名称对应于存储结构。此 CSDL 架构中的 EntitySet 对应于在 SSDL 架构中指定的表的名称。此表包含 Employee
实体(由在此模型上生成的应用程序使用)的实例数据。Employee
实体的各个属性对应于表的各列。
存储架构
SSDL 中的存储元数据描述的数据库包含在概念架构中定义的 Employees
的实例。
在下面的架构中定义的 Employees.Store
命名空间是已在概念架构中定义的 Employees
模型的目标数据库。
此架构中的 EntitySetEmployees
表示名为 Employees
的数据表。此架构指定的 EntityType 对应于在概念架构中定义的 EntityType。存储元数据中的名称不必与概念架构中的名称相匹配,但它确实必须与数据库表的名称相匹配。
下面的架构描述由在 SSDL 文件中指定的 EntityContainer 表示的数据库对象 dbo
。此示例中的 EntityContainer 包含名为 Employees
的表。
?xml version="1.0" encoding="utf-8"?>
<Schema Namespace="Employees.Store" Alias="Self"
Provider="System.Data.SqlClient"
ProviderManifestToken="2005"
xmlns="https://schemas.microsoft.com/ado/2006/04/edm/ssdl">
<EntityContainer Name="dbo">
<EntitySet Name="Employees" EntityType="Employees.Store.Employees" />
</EntityContainer>
<EntityType Name="Employees">
<Key>
<PropertyRef Name="EmployeeId" />
</Key>
<Property Name="EmployeeId" Type="uniqueidentifier" Nullable="false" />
<Property Name="LastName" Type="nvarchar" Nullable="false" MaxLength="50" />
<Property Name="FirstName" Type="nvarchar" Nullable="false" />
<Property Name="Email" Type="nvarchar" Nullable="false" />
</EntityType>
</Schema>
映射规范
映射规范在映射规范语言 (MSL) 中定义。此 MSL 规范将 CSDL 架构连接到使用 SSDL 架构中元数据的数据库。
此 MSL 架构的元素包括 EntityContainerMapping、StorageEntityContainer、EntityTypeMapping、MappingFragment 和 ScalarProperty 映射。EntityContainerMapping 将 CdmEntityContainer 映射到 StorageEntityContainer,在此示例中,是将 EmployeeSkills
实体容器映射到数据库对象 dbo
。
请注意,分配给 StorageEntityContainer 和 CdmEntityContainer 的名称不受架构命名空间限定。StorageEntityContainer 和 CdmEntityContainer 是不同的元素,并且独立于概念架构和存储元数据中的架构元素。使用命名空间名称限定 StorageEntityContainer 和 CdmEntityContainer 名称会导致映射异常。
在 StorageEntityContainer 和 CdmEntityContainer 映射之后,EntitySetMapping 指定对应于以下概念元素的 StoreEntitySet:
TypeName(Employees
)。
ScalarProperty 元素将 TypeName 的属性 (Property) 映射为对应于 ColumnName 元素(如 Name="EmployeeId" ColumnName="EmployeeId"
)的 Name 属性 (Attribute)。语法 Name 指定概念架构中的实体的属性,而 ColumnName 指定目标数据库中 Employees
数据表的列。
<?xml version="1.0" encoding="utf-8"?>
<Mapping Space="C-S"
xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS">
<EntityContainerMapping StorageEntityContainer="dbo"
CdmEntityContainer="EmployeesContext">
<EntitySetMapping Name="Employees" StoreEntitySet="Employees"
TypeName="Employees.Employees">
<ScalarProperty Name="EmployeeId" ColumnName="EmployeeId" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="Email" ColumnName="Email" />
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>