将概念模型映射到存储模型
实体框架 使用概念模型提供以对象为中心的数据视图(以实体类型和关联表示)。 应用程序开发人员只需考虑对从概念模型生成的类进行编程,而不必考虑存储架构以及如何访问数据存储中的对象并将这些对象转换为编程对象。 实体框架 使用概念模型、存储模型和这些模型之间的映射将对实体的创建、读取、更新和删除操作转换为数据源中的等效操作。
注意: |
---|
本节中演示的所有映射文件片段都由Entity Data Model Wizard生成。 |
概念模型
应用程序的概念模型表示概念架构定义语言 (CSDL) 中的实体和关系,是Entity Data Model的实现。 CSDL 是基于 XML 的语言。 CSDL 中定义的每个实体类型都具有一个名称、一个用于唯一标识实例的键和一组属性。 分配给属性的数据类型指定为简单类型(标量属性)或复杂类型(由一个或多个标量或复杂属性组成的类型)。 XML 特性还可以指定是否可为 null 值或分配默认值。 关联定义实体之间的关系。 实体框架术语中更加详细地介绍了实体框架 语言元素和术语。
下面的 XML 片段表示 School 概念模型(基于 School 示例数据库)的一部分。 此示例演示通过 FK_Course_Department 关联相关的 Course 和 Department 实体类型(移除了其他实体和关联)。
<Schema Namespace="SchoolModel" Alias="Self"
xmlns:annotation="https://schemas.microsoft.com/ado/2009/02/edm/annotation"
xmlns="https://schemas.microsoft.com/ado/2008/09/edm">
<EntityContainer Name="SchoolEntities">
<EntitySet Name="Courses" EntityType="SchoolModel.Course" />
<EntitySet Name="Departments" EntityType="SchoolModel.Department" />
<AssociationSet Name="FK_Course_Department"
Association="SchoolModel.FK_Course_Department">
<End Role="Department" EntitySet="Departments" />
<End Role="Course" EntitySet="Courses" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Course">
<Key>
<PropertyRef Name="CourseID" />
</Key>
<Property Name="CourseID" Type="Int32" Nullable="false" />
<Property Name="Title" Type="String" Nullable="false"
MaxLength="100" Unicode="true" FixedLength="false" />
<Property Name="Credits" Type="Int32" Nullable="false" />
<Property Name="DepartmentID" Type="Int32" Nullable="false" />
<NavigationProperty Name="Department"
Relationship="SchoolModel.FK_Course_Department"
FromRole="Course" ToRole="Department" />
</EntityType>
<EntityType Name="Department">
<Key>
<PropertyRef Name="DepartmentID" />
</Key>
<Property Name="DepartmentID" Type="Int32" Nullable="false" />
<Property Name="Name" Type="String" Nullable="false"
MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="Budget" Type="Decimal" Nullable="false"
Precision="19" Scale="4" />
<Property Name="StartDate" Type="DateTime" Nullable="false" />
<Property Name="Administrator" Type="Int32" />
<NavigationProperty Name="Courses"
Relationship="SchoolModel.FK_Course_Department"
FromRole="Department" ToRole="Course" />
</EntityType>
<Association Name="FK_Course_Department">
<End Role="Department" Type="SchoolModel.Department"
Multiplicity="1" />
<End Role="Course" Type="SchoolModel.Course" Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Department">
<PropertyRef Name="DepartmentID" />
</Principal>
<Dependent Role="Course">
<PropertyRef Name="DepartmentID" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
存储模型
使用存储架构定义语言 (SSDL) 介绍存储模型。 在 SSDL 中声明的属性的数据类型为存储模型的数据类型。 此存储模型片段演示的示例为 School 数据库中通过 FK_Course_Department 外键相关的 Course 和 Department 表的存储元数据(移除了其他实体)。
<Schema Namespace="SchoolModel.Store" Alias="Self"
Provider="System.Data.SqlClient" ProviderManifestToken="2005"
xmlns:store="https://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator"
xmlns="https://schemas.microsoft.com/ado/2009/02/edm/ssdl">
<EntityContainer Name="SchoolModelStoreContainer">
<EntitySet Name="Course" EntityType="SchoolModel.Store.Course"
store:Type="Tables" Schema="dbo" />
<EntitySet Name="Department"
EntityType="SchoolModel.Store.Department"
store:Type="Tables" Schema="dbo" />
<AssociationSet Name="FK_Course_Department"
Association="SchoolModel.Store.FK_Course_Department">
<End Role="Department" EntitySet="Department" />
<End Role="Course" EntitySet="Course" />
</AssociationSet>
</EntityContainer>
<EntityType Name="Course">
<Key>
<PropertyRef Name="CourseID" />
</Key>
<Property Name="CourseID" Type="int" Nullable="false" />
<Property Name="Title" Type="nvarchar" Nullable="false"
MaxLength="100" />
<Property Name="Credits" Type="int" Nullable="false" />
<Property Name="DepartmentID" Type="int" Nullable="false" />
</EntityType>
<EntityType Name="Department">
<Key>
<PropertyRef Name="DepartmentID" />
</Key>
<Property Name="DepartmentID" Type="int" Nullable="false" />
<Property Name="Name" Type="nvarchar" Nullable="false"
MaxLength="50" />
<Property Name="Budget" Type="money" Nullable="false" />
<Property Name="StartDate" Type="datetime" Nullable="false" />
<Property Name="Administrator" Type="int" />
</EntityType>
<Association Name="FK_Course_Department">
<End Role="Department" Type="SchoolModel.Store.Department"
Multiplicity="1" />
<End Role="Course" Type="SchoolModel.Store.Course"
Multiplicity="*" />
<ReferentialConstraint>
<Principal Role="Department">
<PropertyRef Name="DepartmentID" />
</Principal>
<Dependent Role="Course">
<PropertyRef Name="DepartmentID" />
</Dependent>
</ReferentialConstraint>
</Association>
</Schema>
映射规范
映射规范使用映射规范语言 (MSL) 将概念模型映射到存储模型。 此 MSL 片段演示用于 School 模型中的 Course 和 Department 实体的概念模型与存储模型之间的一对一映射。
<Mapping Space="C-S"
xmlns="https://schemas.microsoft.com/ado/2008/09/mapping/cs">
<EntityContainerMapping
StorageEntityContainer="SchoolModelStoreContainer"
CdmEntityContainer="SchoolEntities">
<EntitySetMapping Name="Courses">
<EntityTypeMapping TypeName="SchoolModel.Course">
<MappingFragment StoreEntitySet="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="Title" ColumnName="Title" />
<ScalarProperty Name="Credits" ColumnName="Credits" />
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
<EntitySetMapping Name="Departments">
<EntityTypeMapping TypeName="SchoolModel.Department">
<MappingFragment StoreEntitySet="Department">
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
<ScalarProperty Name="Name" ColumnName="Name" />
<ScalarProperty Name="Budget" ColumnName="Budget" />
<ScalarProperty Name="StartDate" ColumnName="StartDate" />
<ScalarProperty Name="Administrator"
ColumnName="Administrator" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
</EntityContainerMapping>
</Mapping>
讨论
此处讨论的 School 模型使用概念实体与数据库表之间简单的一对一映射,但是实体框架 支持更为复杂的映射(例如每个层次结构一个表映射或每种类型一个表映射)。 有关更多信息,请参见Entity Data Model Tools Scenarios和定义高级数据模型(实体框架任务)。