MSL 规范
注意
不支持 MSL v1,请更新到 V3
映射规范语言 (MSL) 是一种基于 XML 的语言,它描述了 Entity Framework 应用程序的概念模型与存储模型之间的映射。
在 Entity Framework 应用程序中,映射元数据是在生成时从 .msl 文件(以 MSL 编写)加载的。 Entity Framework 在运行时使用映射元数据将对概念模型的查询转换为存储特定的命令。
Entity Framework Designer (EF Designer) 在设计时将映射信息存储在 .edmx 文件中。 在生成时,Entity Designer 使用 .edmx 文件中的信息创建 Entity Framework 在运行时所需的 .msl 文件
MSL 中引用的所有概念模型类型或存储模型类型的名称必须由其各自的命名空间名称限定。 有关概念模型命名空间名称的信息,请参阅 CSDL 规范。 有关存储模型命名空间名称的信息,请参阅 SSDL 规范。
MSL 的版本按 XML 命名空间进行区分。
MSL 版本 | XML 命名空间 |
---|---|
MSL v1 | urn:schemas-microsoft-com:windows:storage:mapping:CS |
MSL v2 | https://schemas.microsoft.com/ado/2008/09/mapping/cs |
MSL v3 | https://schemas.microsoft.com/ado/2009/11/mapping/cs |
Alias 元素 (MSL)
以映射规范语言 (MSL) 表示的 Alias 元素为 Mapping 元素的子元素,它用于定义概念模型和存储模型命名空间的别名。 MSL 中引用的所有概念模型类型或存储模型类型的名称必须由其各自的命名空间名称限定。 有关概念模型命名空间名称的信息,请参阅“架构元素 (CSDL)”。 有关存储模型命名空间名称的信息,请参阅“架构元素 (SSDL)”。
Alias 元素不能有子元素。
适用的属性
下表介绍可应用于 Alias 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
键 | 是 | 由“Value”属性指定的命名空间的别名。 |
值 | 是 | “Key”元素的值为别名的命名空间。 |
示例
下面的示例演示 Alias 元素,该元素为概念模型中定义的类型定义别名 c
。
<Mapping Space="C-S"
xmlns="https://schemas.microsoft.com/ado/2009/11/mapping/cs">
<Alias Key="c" Value="SchoolModel"/>
<EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
CdmEntityContainer="SchoolModelEntities">
<EntitySetMapping Name="Courses">
<EntityTypeMapping TypeName="c.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="c.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>
AssociationEnd 元素 (MSL)
当将概念模型中的实体类型的修改函数映射到基础数据库的存储过程中时,使用以映射规范语言 (MSL) 表示的 AssociationEnd 元素。 如果某个修改存储过程采用其值保存在关联属性中的参数,则 AssociationEnd 元素会将属性值映射到该参数。 有关更多信息,请参见下面的示例。
有关将实体类型的修改函数映射到存储过程的详细信息,请参阅 ModificationFunctionMapping 元素 (MSL) 和演练:将实体映射到存储过程。
AssociationEnd 元素可以具有以下子元素:
- ScalarProperty
适用的属性
下表介绍适用于 AssociationEnd 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
AssociationSet | 是 | 要映射的关联的名称。 |
从 | 是 | 对应于要映射关联的导航属性的 FromRole 属性的值。 有关详细信息,请参阅“NavigationProperty 元素 (CSDL)”。 |
操作 | 是 | 对应于要映射关联的导航属性的 ToRole 属性的值。 有关详细信息,请参阅“NavigationProperty 元素 (CSDL)”。 |
示例
请考虑使用以下概念模型实体类型:
<EntityType Name="Course">
<Key>
<PropertyRef Name="CourseID" />
</Key>
<Property Type="Int32" Name="CourseID" Nullable="false" />
<Property Type="String" Name="Title" Nullable="false" MaxLength="100"
FixedLength="false" Unicode="true" />
<Property Type="Int32" Name="Credits" Nullable="false" />
<NavigationProperty Name="Department"
Relationship="SchoolModel.FK_Course_Department"
FromRole="Course" ToRole="Department" />
</EntityType>
另请考虑使用以下存储过程:
CREATE PROCEDURE [dbo].[UpdateCourse]
@CourseID int,
@Title nvarchar(50),
@Credits int,
@DepartmentID int
AS
UPDATE Course SET Title=@Title,
Credits=@Credits,
DepartmentID=@DepartmentID
WHERE CourseID=@CourseID;
为将 Course
实体的 update 函数映射到此存储过程,必须为 DepartmentID 参数提供一个值。 DepartmentID
的值与实体类型中的某个属性不对应;该值包含在独立的关联中,此关联的映射如下所示:
<AssociationSetMapping Name="FK_Course_Department"
TypeName="SchoolModel.FK_Course_Department"
StoreEntitySet="Course">
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<EndProperty Name="Department">
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
</EndProperty>
</AssociationSetMapping>
以下代码显示了用于将 FK_Course_Department 关联的 DepartmentID 属性映射到 UpdateCourse 存储过程(Course 实体类型的 update 函数映射到该存储过程)的 AssociationEnd 元素:
<EntitySetMapping Name="Courses">
<EntityTypeMapping TypeName="SchoolModel.Course">
<MappingFragment StoreEntitySet="Course">
<ScalarProperty Name="Credits" ColumnName="Credits" />
<ScalarProperty Name="Title" ColumnName="Title" />
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="SchoolModel.Course">
<ModificationFunctionMapping>
<UpdateFunction FunctionName="SchoolModel.Store.UpdateCourse">
<AssociationEnd AssociationSet="FK_Course_Department"
From="Course" To="Department">
<ScalarProperty Name="DepartmentID"
ParameterName="DepartmentID"
Version="Current" />
</AssociationEnd>
<ScalarProperty Name="Credits" ParameterName="Credits"
Version="Current" />
<ScalarProperty Name="Title" ParameterName="Title"
Version="Current" />
<ScalarProperty Name="CourseID" ParameterName="CourseID"
Version="Current" />
</UpdateFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
AssociationSetMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 AssociationSetMapping 元素定义概念模型中的关联与基础数据库中的表列之间的映射。
概念模型中的关联是一些属性表示基础数据库中的主键列和外键列的类型。 AssociationSetMapping 元素使用两个 EndProperty 元素来定义数据库中的关联类型属性与列之间的映射。 可以使用 Condition 元素对这些映射施加条件。 使用 ModificationFunctionMapping 元素将关联的插入、更新和删除函数映射到数据库中的存储过程。 通过在 QueryView 元素中使用实体 SQL 字符串,定义关联与表列之间的只读映射。
注意
如果为概念模型中的某个关联定义了引用约束,则无需使用 AssociationSetMapping 元素映射该关联。 如果某个具有引用约束的关联存在一个 AssociationSetMapping 元素,则在 AssociationSetMapping 元素中定义的映射将被忽略。 有关详细信息,请参阅“ReferentialConstraint 元素 (CSDL)”。
AssociationSetMapping 元素可以具有以下子元素
- QueryView(零个或一个)
- EndProperty(零个或两个)
- Condition(零个或多个)
- ModificationFunctionMapping(零个或一个)
适用的属性
下表介绍可应用于 AssociationSetMapping 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
Name | 是 | 要映射的概念模型关联集的名称。 |
TypeName | 否 | 要映射的概念模型关联类型的命名空间限定的名称。 |
StoreEntitySet | 否 | 要映射的表的名称。 |
示例
下面的示例介绍 AssociationSetMapping 元素,其中概念模型中的 FK_Course_Department 关联集映射到数据库中的 Course 表。 关联类型属性与表列之间的映射在 EndProperty 子元素中指定。
<AssociationSetMapping Name="FK_Course_Department"
TypeName="SchoolModel.FK_Course_Department"
StoreEntitySet="Course">
<EndProperty Name="Department">
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
</AssociationSetMapping>
ComplexProperty 元素 (MSL)
以映射规范语言 (MSL) 表示的 ComplexProperty 元素定义概念模型实体类型中的复杂类型属性与基础数据库中的表列之间的映射。 属性-列映射在子 ScalarProperty 元素中指定。
ComplexType 属性元素可以具有以下子元素:
- ScalarProperty(零个或多个)
- ComplexProperty(零个或多个)
- ComplexTypeMapping(零个或多个)
- Condition(零个或多个)
适用的属性
下表介绍适用于 ComplexProperty 元素的属性:
属性名称 | 为必填 | 值 |
---|---|---|
Name | 是 | 概念模型中要映射的实体类型的复杂属性的名称。 |
TypeName | 否 | 概念模型属性类型的命名空间限定名称。 |
示例
下面的示例基于 School 模型。 下面的复杂类型已添加到概念模型中:
<ComplexType Name="FullName">
<Property Type="String" Name="LastName"
Nullable="false" MaxLength="50"
FixedLength="false" Unicode="true" />
<Property Type="String" Name="FirstName"
Nullable="false" MaxLength="50"
FixedLength="false" Unicode="true" />
</ComplexType>
Person 实体类型的 LastName 和 FirstName 属性已被替换为一个复杂的属性,即 Name:
<EntityType Name="Person">
<Key>
<PropertyRef Name="PersonID" />
</Key>
<Property Name="PersonID" Type="Int32" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
<Property Name="HireDate" Type="DateTime" />
<Property Name="EnrollmentDate" Type="DateTime" />
<Property Name="Name" Type="SchoolModel.FullName" Nullable="false" />
</EntityType>
下面的 MSL 演示了用于将 Name 属性映射到基础数据库中的列的 ComplexProperty 元素:
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="SchoolModel.Person">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" />
<ComplexProperty Name="Name" TypeName="SchoolModel.FullName">
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
</ComplexProperty>
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
ComplexTypeMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 ComplexTypeMapping 元素为 ResultMapping 元素的子元素,且当满足以下条件时,定义概念模型中的函数导入与基础数据库中的存储过程之间的映射:
- 函数导入返回一个概念复杂类型。
- 存储过程返回的列的名称与复杂类型的属性名称不完全匹配。
默认情况下,存储过程返回的列与复杂类型返回的列之间的映射基于列名称和属性名称。 如果列名称与属性名称不完全匹配,则必须使用 ComplexTypeMapping 元素定义映射。 有关默认映射的示例,请参阅“FunctionImportMapping 元素 (MSL)”。
ComplexTypeMapping 元素可以具有以下子元素:
- ScalarProperty(零个或多个)
适用的属性
下表介绍适用于 ComplexTypeMapping 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
TypeName | 是 | 要映射的复杂类型的命名空间限定的名称。 |
示例
请思考以下存储过程:
CREATE PROCEDURE [dbo].[GetGrades]
@student_Id int
AS
SELECT EnrollmentID as enroll_id,
Grade as grade,
CourseID as course_id,
StudentID as student_id
FROM dbo.StudentGrade
WHERE StudentID = @student_Id
另请考虑使用以下概念模型复杂类型:
<ComplexType Name="GradeInfo">
<Property Type="Int32" Name="EnrollmentID" Nullable="false" />
<Property Type="Decimal" Name="Grade" Nullable="true"
Precision="3" Scale="2" />
<Property Type="Int32" Name="CourseID" Nullable="false" />
<Property Type="Int32" Name="StudentID" Nullable="false" />
</ComplexType>
为创建一个返回前一个复杂类型的实例的函数导入,必须在 ComplexTypeMapping 元素中定义存储过程返回的列与实体类型返回的列之间的映射:
<FunctionImportMapping FunctionImportName="GetGrades"
FunctionName="SchoolModel.Store.GetGrades" >
<ResultMapping>
<ComplexTypeMapping TypeName="SchoolModel.GradeInfo">
<ScalarProperty Name="EnrollmentID" ColumnName="enroll_id"/>
<ScalarProperty Name="CourseID" ColumnName="course_id"/>
<ScalarProperty Name="StudentID" ColumnName="student_id"/>
<ScalarProperty Name="Grade" ColumnName="grade"/>
</ComplexTypeMapping>
</ResultMapping>
</FunctionImportMapping>
Condition 元素 (MSL)
以映射规范语言 (MSL) 表示的 Condition 元素将映射的条件置于概念模型和基础数据库之间。 如果根据 Condition 子元素中所述,所有条件均满足,则在 XML 节点内定义的映射有效。 否则,该映射无效。 例如,如果 MappingFragment 元素包含一个或多个 Condition 子元素,则 MappingFragment 节点中定义的映射仅在满足 Condition 子元素的所有条件时才有效。
每个条件都可应用于 Name(概念模型实体属性的名称,由 Name 属性指定)或 ColumnName(数据库中列的名称,由 ColumnName 属性指定)。 设置 Name 属性时,将根据实体属性值对条件进行检查。 设置 ColumnName 属性时,将根据列值对条件进行检查。 在 Condition 元素中只能指定 Name 或 ColumnName 属性之一。
注意
在 FunctionImportMapping 元素内使用 Condition 元素时,只有 Name 属性不适用。
Condition 元素可以是以下元素的子元素:
- AssociationSetMapping
- ComplexProperty
- EntitySetMapping
- MappingFragment
- EntityTypeMapping
Condition 元素可以没有子元素。
适用的属性
下表介绍适用于 Condition 元素的属性:
属性名称 | 为必填 | 值 |
---|---|---|
ColumnName | 否 | 表列的名称,其值用于计算条件。 |
IsNull | 否 | True 或 False。 如果值为 True 且列值为 null,或者如果值为 False 但列值不为 null,则条件为 True。 否则,条件为 False。 IsNull 和“Value”属性不能同时使用。 |
值 | 否 | 要与列值进行比较的值。 如果值不同,则该条件为 True。 否则,条件为 False。 IsNull 和“Value”属性不能同时使用。 |
Name | 否 | 概念模型实体属性的名称,其值用于计算条件。 如果在 FunctionImportMapping 元素内使用 Condition 元素,则此属性不适用。 |
示例
下面的示例将 Condition 元素显示为 MappingFragment 元素的子元素。 当 HireDate 不为 null 且 EnrollmentDate 为 null 时,数据在 SchoolModel.Instructor 类型与 Person 表的 PersonID 和 HireDate 列之间进行映射。 当 EnrollmentDate 不为 null 且 HireDate 为 null 时,数据在 SchoolModel.Student 类型与 Person 表的 PersonID 和 Enrollment 列之间进行映射。
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<Condition ColumnName="HireDate" IsNull="false" />
<Condition ColumnName="EnrollmentDate" IsNull="true" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Student)">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="EnrollmentDate"
ColumnName="EnrollmentDate" />
<Condition ColumnName="EnrollmentDate" IsNull="false" />
<Condition ColumnName="HireDate" IsNull="true" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
DeleteFunction 元素 (MSL)
以映射规范语言 (MSL) 表示的 DeleteFunction 元素将概念模型中的实体类型或关联的 delete 函数映射到基础数据库中的存储过程。 将修改函数映射到其中的存储过程必须在存储模型中声明。 有关详细信息,请参阅函数元素 (SSDL)。
注意
如果没有将实体类型的 insert、update 或 delete 这三种操作全部映射到存储过程,则在运行时执行的情况下未映射的操作将失败且会引发 UpdateException。
应用于 EntityTypeMapping 的 DeleteFunction
如果将 DeleteFunction 元素应用于 EntityTypeMapping 元素,该元素会将概念模型中的实体类型的 delete 函数映射到存储过程。
DeleteFunction 元素在应用于 EntityTypeMapping 元素时可以具有以下子元素:
- AssociationEnd(零个或多个)
- ComplexProperty(零个或多个)
- ScalarProperty(零个或多个)
适用的属性
下表介绍当 DeleteFunction 元素应用于 EntityTypeMapping 元素时,可应用于该元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
FunctionName | 是 | 删除函数要映射到的存储过程的命名空间限定名称。 存储过程必须在存储模型中声明。 |
RowsAffectedParameter | 否 | 返回受影响行数的输出参数的名称。 |
示例
下面的示例基于 School 模型,并演示将 Person 实体类型的 delete 函数映射到 DeletePerson 存储过程的 DeleteFunction 元素。 DeletePerson 存储过程在存储模型中进行声明。
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="SchoolModel.Person">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<ScalarProperty Name="EnrollmentDate"
ColumnName="EnrollmentDate" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate" />
<ScalarProperty Name="HireDate" ParameterName="HireDate" />
<ScalarProperty Name="FirstName" ParameterName="FirstName" />
<ScalarProperty Name="LastName" ParameterName="LastName" />
<ResultBinding Name="PersonID" ColumnName="NewPersonID" />
</InsertFunction>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
<ScalarProperty Name="PersonID" ParameterName="PersonID" />
</DeleteFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
应用于 AssociationSetMapping 的 DeleteFunction
如果将 DeleteFunction 元素应用于 AssociationSetMapping 元素,该元素会将概念模型中的关联的 delete 函数映射到存储过程。
DeleteFunction 元素在应用于 AssociationSetMapping 元素时可以具有以下子元素:
- EndProperty
适用的属性
下表介绍当 DeleteFunction 元素应用于 AssociationSetMapping 元素时,可应用于该元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
FunctionName | 是 | 删除函数要映射到的存储过程的命名空间限定名称。 存储过程必须在存储模型中声明。 |
RowsAffectedParameter | 否 | 返回受影响行数的输出参数的名称。 |
示例
下面的示例基于 School 模型,介绍用于将 CourseInstructor 关联的 delete 函数映射到 DeleteCourseInstructor 存储过程的 DeleteFunction 元素。 DeleteCourseInstructor 存储过程在存储模型中进行声明。
<AssociationSetMapping Name="CourseInstructor"
TypeName="SchoolModel.CourseInstructor"
StoreEntitySet="CourseInstructor">
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</InsertFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</DeleteFunction>
</ModificationFunctionMapping>
</AssociationSetMapping>
EndProperty 元素 (MSL)
以映射规范语言 (MSL) 表示的 EndProperty 元素定义概念模型关联的端函数或修改函数与基础数据库之间的映射。 属性-列映射在子 ScalarProperty 元素中指定。
当使用 EndProperty 元素定义概念模型关联端的映射时,该元素是 AssociationSetMapping 元素的子元素。 当使用 EndProperty 元素定义概念模型关联的修改函数的映射时,该元素是 InsertFunction 元素或 DeleteFunction 元素的子元素。
EndProperty 元素可以具有以下子元素:
- ScalarProperty(零个或多个)
适用的属性
下表介绍适用于 EndProperty 元素的属性:
属性名称 | 为必填 | 值 |
---|---|---|
名称 | 是 | 要映射的关联端的名称。 |
示例
以下示例显示了一个 AssociationSetMapping 元素,其中概念模型中的 FK_Course_Department 关联映射到数据库中的 Course 表。 关联类型属性与表列之间的映射在 EndProperty 子元素中指定。
<AssociationSetMapping Name="FK_Course_Department"
TypeName="SchoolModel.FK_Course_Department"
StoreEntitySet="Course">
<EndProperty Name="Department">
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
</AssociationSetMapping>
示例
下面的示例演示了将关联 (CourseInstructor) 的 insert 和 delete 函数映射到基础数据库中的存储过程的 EndProperty 元素。 映射到的函数在存储模型中声明。
<AssociationSetMapping Name="CourseInstructor"
TypeName="SchoolModel.CourseInstructor"
StoreEntitySet="CourseInstructor">
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</InsertFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</DeleteFunction>
</ModificationFunctionMapping>
</AssociationSetMapping>
EntityContainerMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 EntityContainerMapping 元素将概念模型中的实体容器映射到存储模型中的实体容器。 EntityContainerMapping 元素是 Mapping 元素的子元素。
EntityContainerMapping 元素可以具有以下子元素(按所列顺序):
- EntitySetMapping(零个或多个)
- AssociationSetMapping(零个或多个)
- FunctionImportMapping(零个或多个)
适用的属性
下表介绍可应用于 EntityContainerMapping 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
StorageModelContainer | 是 | 要映射到的存储模型实体容器的名称。 |
CdmEntityContainer | 是 | 要映射的概念模型实体容器的名称。 |
GenerateUpdateViews | 否 | True 或 False。 如果为 False,则没有生成任何更新视图。 由于数据可能不能成功往返,而使得只读映射可能无效时,应将此属性设置为 False。 默认值为 True。 |
示例
以下示例显示 EntityContainerMapping 元素,该元素将 SchoolModelEntities 容器(概念模型实体容器)映射到 SchoolModelStoreContainer 容器(存储模型实体容器):
<EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
CdmEntityContainer="SchoolModelEntities">
<EntitySetMapping Name="Courses">
<EntityTypeMapping TypeName="c.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="c.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>
EntitySetMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 EntitySetMapping 元素将概念模型实体集中所有类型映射到存储模型中的实体集。 概念模型中的实体集为同一类型(和派生类型)实体的实例的逻辑容器。 存储模型中的实体集表示基础数据库中的一个表或视图。 概念模型实体集由 EntitySetMapping 元素的 Name 属性的值指定。 映射到的表或视图由每个 MappingFragment 子元素或 EntitySetMapping 元素本身中的 StoreEntitySet 属性指定。
EntitySetMapping 元素可以具有以下子元素:
- EntityTypeMapping(零个或多个)
- QueryView(零个或一个)
- MappingFragment(零个或多个)
适用的属性
下表介绍可应用于 EntitySetMapping 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
Name | 是 | 要映射的概念模型实体集的名称。 |
TypeName 1 | 否 | 要映射的概念模型实体类型的名称。 |
StoreEntitySet 1 | 否 | 要映射到的存储模型实体集的名称。 |
MakeColumnsDistinct | 否 | True 或 False,具体取决于是否仅返回不同行。 如果此属性设置为 True,则 EntityContainerMapping 元素的 GenerateUpdateViews 属性必须设置为 False。 |
1 可以使用 TypeName 和 StoreEntitySet 属性替代 EntityTypeMapping 和 MappingFragment 子元素,将单个实体类型映射到单个表。
示例
以下示例显示 EntitySetMapping 元素,该元素将概念模型的 Courses 实体集中的三个类型(一个基类型和两个派生类型)映射到基础数据库中三个不同的表。 这些表由每个 MappingFragment 元素中的 StoreEntitySet 属性指定。
<EntitySetMapping Name="Courses">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel1.Course)">
<MappingFragment StoreEntitySet="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="DepartmentID" ColumnName="DepartmentID" />
<ScalarProperty Name="Credits" ColumnName="Credits" />
<ScalarProperty Name="Title" ColumnName="Title" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel1.OnlineCourse)">
<MappingFragment StoreEntitySet="OnlineCourse">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="URL" ColumnName="URL" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel1.OnsiteCourse)">
<MappingFragment StoreEntitySet="OnsiteCourse">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="Time" ColumnName="Time" />
<ScalarProperty Name="Days" ColumnName="Days" />
<ScalarProperty Name="Location" ColumnName="Location" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
EntityTypeMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 EntityTypeMapping 元素定义概念模型中的实体类型与基础数据库中的表或视图之间的映射。 有关概念模型实体类型与基础数据库表或视图的信息,请参阅 EntityType 元素 (CSDL) 和 EntitySet 元素 (SSDL)。 被映射的概念模型实体类型由 EntityTypeMapping 元素的 TypeName 属性指定。 被映射的表或视图由 MappingFragment 子元素的 StoreEntitySet 属性指定。
ModificationFunctionMapping 子元素可以用于将实体类型的插入、更新或删除函数映射到数据库中的存储过程。
EntityTypeMapping 元素可以具有以下子元素:
- MappingFragment(零个或多个)
- ModificationFunctionMapping(零个或一个)
- ScalarProperty
- 条件
注意
MappingFragment 和 ModificationFunctionMapping 元素不能同时是 EntityTypeMapping 元素的子元素。
注意
在 FunctionImportMapping 元素中使用时,ScalarProperty 和 Condition 元素只能是 EntityTypeMapping 元素的子元素。
适用的属性
下表介绍可应用于 EntityTypeMapping 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
TypeName | 是 | 要映射的概念模型实体类型的命名空间限定的名称。 如果类型为抽象类型或派生类型,则值必须为 IsOfType(Namespace-qualified_type_name) 。 |
示例
下面的示例显示具有两个 EntityTypeMapping 子元素的 EntitySetMapping 元素。 在第一个 EntityTypeMapping 元素中,SchoolModel.Person 实体类型映射到 Person 表。 在第二个 EntityTypeMapping 元素中,SchoolModel.Person 类型的更新功能映射到数据库中的存储过程 UpdatePerson。
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="SchoolModel.Person">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<ScalarProperty Name="EnrollmentDate" ColumnName="EnrollmentDate" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate" ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
示例
下一示例演示其中根类型为抽象类型的类型层次结构的映射。 请注意 TypeName 属性的 IsOfType
语法的用法。
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Person)">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Instructor)">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<Condition ColumnName="HireDate" IsNull="false" />
<Condition ColumnName="EnrollmentDate" IsNull="true" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.Student)">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="EnrollmentDate"
ColumnName="EnrollmentDate" />
<Condition ColumnName="EnrollmentDate" IsNull="false" />
<Condition ColumnName="HireDate" IsNull="true" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
FunctionImportMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 FunctionImportMapping 元素定义概念模型中的函数导入与基础数据库中的存储过程或函数之间的映射。 函数导入必须在概念模型中进行声明,存储的过程必须在存储模型中进行声明。 有关详细信息,请参阅“FunctionImport 元素 (CSDL) 和函数元素 (SSDL)”。
注意
默认情况下,如果函数导入返回概念模型实体类型或复杂类型,则基础存储过程返回的列名称必须与概念模型类型中的属性名称完全匹配。 如果列名称与属性名称不完全匹配,则必须在 ResultMapping 元素中定义映射。
FunctionImportMapping 元素可以具有以下子元素:
- ResultMapping(零个或多个)
适用的属性
下表介绍适用于 FunctionImportMapping 元素的属性:
属性名称 | 为必填 | 值 |
---|---|---|
FunctionImportName | 是 | 概念模型中要映射的函数导入的名称。 |
FunctionName | 是 | 存储模型中要映射的函数的命名空间限定名称。 |
示例
下面的示例基于 School 模型。 请考虑在存储模型中使用以下函数:
<Function Name="GetStudentGrades" Aggregate="false"
BuiltIn="false" NiladicFunction="false"
IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion"
Schema="dbo">
<Parameter Name="StudentID" Type="int" Mode="In" />
</Function>
另请考虑在概念模型中使用此函数导入:
<FunctionImport Name="GetStudentGrades" EntitySet="StudentGrades"
ReturnType="Collection(SchoolModel.StudentGrade)">
<Parameter Name="StudentID" Mode="In" Type="Int32" />
</FunctionImport>
下面的示例演示了用于将上述函数与函数导入彼此映射的 FunctionImportMapping 元素:
<FunctionImportMapping FunctionImportName="GetStudentGrades"
FunctionName="SchoolModel.Store.GetStudentGrades" />
InsertFunction 元素 (MSL)
以映射规范语言 (MSL) 表示的 InsertFunction 元素将概念模型中的实体类型或关联的插入函数映射到基础数据库中的存储过程。 将修改函数映射到其中的存储过程必须在存储模型中声明。 有关详细信息,请参阅函数元素 (SSDL)。
注意
如果没有将实体类型的 insert、update 或 delete 这三种操作全部映射到存储过程,则在运行时执行的情况下未映射的操作将失败且会引发 UpdateException。
InsertFunction 元素可以为 ModificationFunctionMapping 元素的子元素,并可应用于 EntityTypeMapping 元素或 AssociationSetMapping 元素。
应用于 EntityTypeMapping 的 InsertFunction
如果将 InsertFunction 元素应用于 EntityTypeMapping 元素,该元素会将概念模型中的实体类型的 insert 函数映射到存储过程。
InsertFunction 元素在应用于 EntityTypeMapping 元素时可以具有以下子元素:
- AssociationEnd(零个或多个)
- ComplexProperty(零个或多个)
- ResultBinding(零个或一个)
- ScalarProperty(零个或多个)
适用的属性
下表介绍当 InsertFunction 元素应用于 EntityTypeMapping 元素时,可应用于该元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
FunctionName | 是 | 插入函数要映射到的存储过程的命名空间限定名称。 存储过程必须在存储模型中声明。 |
RowsAffectedParameter | 否 | 返回受影响行数的输出参数的名称。 |
示例
下面的示例基于 School 模型,并显示用于将 Person 实体类型的插入函数映射到 InsertFunction 存储过程的 InsertFunction 元素。 InsertPerson 存储过程在存储模型中声明。
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate" />
<ScalarProperty Name="HireDate" ParameterName="HireDate" />
<ScalarProperty Name="FirstName" ParameterName="FirstName" />
<ScalarProperty Name="LastName" ParameterName="LastName" />
<ResultBinding Name="PersonID" ColumnName="NewPersonID" />
</InsertFunction>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
<ScalarProperty Name="PersonID" ParameterName="PersonID" />
</DeleteFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
应用于 AssociationSetMapping 的 InsertFunction
如果将 InsertFunction 元素应用于 AssociationSetMapping 元素,该元素会将概念模型中的关联的插入函数映射到存储过程。
InsertFunction 元素在应用于 AssociationSetMapping 元素时可以具有以下子元素:
- EndProperty
适用的属性
下表介绍当 InsertFunction 元素应用于 AssociationSetMapping 元素时,可应用于该元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
FunctionName | 是 | 插入函数要映射到的存储过程的命名空间限定名称。 存储过程必须在存储模型中声明。 |
RowsAffectedParameter | 否 | 返回受影响行数的输出参数的名称。 |
示例
以下示例基于 School 模型,并显示用于将 CourseInstructor 关联的插入函数映射到 InsertCourseInstructor 存储过程的 InsertFunction 元素。 InsertCourseInstructor 存储过程在存储模型中声明。
<AssociationSetMapping Name="CourseInstructor"
TypeName="SchoolModel.CourseInstructor"
StoreEntitySet="CourseInstructor">
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</InsertFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</DeleteFunction>
</ModificationFunctionMapping>
</AssociationSetMapping>
Mapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 Mapping 元素包含将概念模型中定义的对象映射到数据库的信息(如存储模型中所述)。 有关详细信息,请参阅 CSDL 规范和 SSDL 规范。
Mapping 元素为映射规范的根元素。 映射规范的 XML 命名空间为 https://schemas.microsoft.com/ado/2009/11/mapping/cs
。
映射元素可以具有以下子元素(按所列顺序):
- Alias(零个或多个)
- EntityContainerMapping(刚好一个)
MSL 中引用的概念模型类型和存储模型类型的名称必须由其相应的命名空间名称限定。 有关概念模型命名空间名称的信息,请参阅“架构元素 (CSDL)”。 有关存储模型命名空间名称的信息,请参阅“架构元素 (SSDL)”。 可以使用 Alias 元素定义 MSL 中使用的命名空间的别名。
适用的属性
下表介绍可应用于 Mapping 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
Space | 是 | C-S。 这是固定值,因此不能更改。 |
示例
下面的示例显示基于部分 School 模型的 Mapping 元素。 有关 School 模型详细信息,请参阅快速入门 (Entity Framework):
<Mapping Space="C-S"
xmlns="https://schemas.microsoft.com/ado/2009/11/mapping/cs">
<Alias Key="c" Value="SchoolModel"/>
<EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
CdmEntityContainer="SchoolModelEntities">
<EntitySetMapping Name="Courses">
<EntityTypeMapping TypeName="c.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="c.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>
MappingFragment 元素 (MSL)
以映射规范语言 (MSL) 表示的 MappingFragment 元素定义概念模型实体类型的属性与数据库中表或视图之间的映射。 有关概念模型实体类型与基础数据库表或视图的信息,请参阅 EntityType 元素 (CSDL) 和 EntitySet 元素 (SSDL)。 MappingFragment 可以是 EntityTypeMapping 元素或 EntitySetMapping 元素的子元素。
MappingFragment 元素可以具有以下子元素:
- ComplexType(零个或多个)
- ScalarProperty(零个或多个)
- Condition(零个或多个)
适用的属性
下表介绍可应用于 MappingFragment 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
StoreEntitySet | 是 | 要映射的表或视图的名称。 |
MakeColumnsDistinct | 否 | True 或 False,具体取决于是否仅返回不同行。 如果此属性设置为 True,则 EntityContainerMapping 元素的 GenerateUpdateViews 属性必须设置为 False。 |
示例
以下示例将 MappingFragment 元素显示为 EntityTypeMapping 元素的子元素。 在此示例中,概念模型中的 Course 类型的属性将映射到数据库中 Course 表的列。
<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>
示例
以下示例将 MappingFragment 元素显示为 EntitySetMapping 元素的子元素。 如上面的示例所示,概念模型中的 Course 类型的属性将映射到数据库中 Course 表的列。
<EntitySetMapping Name="Courses" 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>
</EntitySetMapping>
ModificationFunctionMapping 元素 (MSL)
以映射规范语言 (MSL) 表示的 ModificationFunctionMapping 元素将概念模型实体类型的 insert、update 和 delete 函数映射到基础数据库中的存储过程。 ModificationFunctionMapping 元素还可以将概念模型中用于多对多关联的插入和删除函数映射到基础数据库中的存储过程。 将修改函数映射到其中的存储过程必须在存储模型中声明。 有关详细信息,请参阅函数元素 (SSDL)。
注意
如果没有将实体类型的 insert、update 或 delete 这三种操作全部映射到存储过程,则在运行时执行的情况下未映射的操作将失败且会引发 UpdateException。
注意
如果将继承层次结构中的一个实体的修改函数映射到存储过程,则必须将该层次结构中所有类型的修改函数都映射到存储过程。
ModificationFunctionMapping 元素可以为 EntityTypeMapping 元素或 AssociationSetMapping 的子元素。
ModificationFunctionMapping 元素可以具有以下子元素:
- DeleteFunction(零个或一个)
- InsertFunction(零个或一个)
- UpdateFunction(零个或一个)
没有适用于 ModificationFunctionMapping 元素的属性。
示例
下面的示例演示了 School 模型中 People 实体集的实体集映射。 除了 Person 实体类型的列映射以外,还演示了 Person 类型的 insert、update 和 delete 函数的映射。 映射到的函数在存储模型中声明。
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="SchoolModel.Person">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<ScalarProperty Name="EnrollmentDate"
ColumnName="EnrollmentDate" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate" />
<ScalarProperty Name="HireDate" ParameterName="HireDate" />
<ScalarProperty Name="FirstName" ParameterName="FirstName" />
<ScalarProperty Name="LastName" ParameterName="LastName" />
<ResultBinding Name="PersonID" ColumnName="NewPersonID" />
</InsertFunction>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
<ScalarProperty Name="PersonID" ParameterName="PersonID" />
</DeleteFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
示例
下面的示例演示了 School 模型中 CourseInstructor 关联集的关联集映射。 除 CourseInstructor 关联的列映射外,还演示了 CourseInstructor 关联的 insert 和 delete 函数的映射。 映射到的函数在存储模型中声明。
<AssociationSetMapping Name="CourseInstructor"
TypeName="SchoolModel.CourseInstructor"
StoreEntitySet="CourseInstructor">
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</InsertFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</DeleteFunction>
</ModificationFunctionMapping>
</AssociationSetMapping>
QueryView 元素 (MSL)
以映射规范语言 (MSL) 表示的 QueryView 元素定义概念模型中的实体类型或关联与基础数据库中的表之间的只读映射。 可使用针对存储模型进行计算的实体 SQL 查询定义映射,并且通过概念模型中的实体或关联表示结果集。 因为查询视图是只读的,所以不能使用标准更新命令来更新查询视图所定义的类型。 可以使用修改函数来更新这些类型。 有关详细信息,请参阅“如何:将修改函数映射到存储过程”。
注意
在 QueryView 元素中,不支持包含 GroupBy、组聚合或导航属性的实体 SQL 表达式。
QueryView 元素可以是 EntitySetMapping 元素或 AssociationSetMapping 元素的子元素。 在前一种情况中,查询视图定义概念模型中实体的只读映射。 在后一种情况中,查询视图定义概念模型中关联的只读映射。
注意
如果某个具有引用约束的关联存在一个 AssociationSetMapping 元素,则将忽略该 AssociationSetMapping 元素。 有关详细信息,请参阅“ReferentialConstraint 元素 (CSDL)”。
QueryView 元素不能具有任何子元素。
适用的属性
下表介绍可应用于 QueryView 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
TypeName | 否 | 要由查询视图映射的概念模型类型的名称。 |
示例
下例将 QueryView 元素显示为 EntitySetMapping 元素的子元素,并为 School 模型中的 Department 实体类型定义查询视图映射。
<EntitySetMapping Name="Departments" >
<QueryView>
SELECT VALUE SchoolModel.Department(d.DepartmentID,
d.Name,
d.Budget,
d.StartDate)
FROM SchoolModelStoreContainer.Department AS d
WHERE d.Budget > 150000
</QueryView>
</EntitySetMapping>
由于查询仅返回存储模型中 Department 类型的成员子集,因此已根据此映射对 School 模型中的 Department 类型进行了修改,如下所示:
<EntityType Name="Department">
<Key>
<PropertyRef Name="DepartmentID" />
</Key>
<Property Type="Int32" Name="DepartmentID" Nullable="false" />
<Property Type="String" Name="Name" Nullable="false"
MaxLength="50" FixedLength="false" Unicode="true" />
<Property Type="Decimal" Name="Budget" Nullable="false"
Precision="19" Scale="4" />
<Property Type="DateTime" Name="StartDate" Nullable="false" />
<NavigationProperty Name="Courses"
Relationship="SchoolModel.FK_Course_Department"
FromRole="Department" ToRole="Course" />
</EntityType>
示例
下一示例将 QueryView 元素显示为 AssociationSetMapping 元素的子元素,并为 School 模型中的 FK_Course_Department
关联定义只读映射。
<EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer"
CdmEntityContainer="SchoolEntities">
<EntitySetMapping Name="Courses" >
<QueryView>
SELECT VALUE SchoolModel.Course(c.CourseID,
c.Title,
c.Credits)
FROM SchoolModelStoreContainer.Course AS c
</QueryView>
</EntitySetMapping>
<EntitySetMapping Name="Departments" >
<QueryView>
SELECT VALUE SchoolModel.Department(d.DepartmentID,
d.Name,
d.Budget,
d.StartDate)
FROM SchoolModelStoreContainer.Department AS d
WHERE d.Budget > 150000
</QueryView>
</EntitySetMapping>
<AssociationSetMapping Name="FK_Course_Department" >
<QueryView>
SELECT VALUE SchoolModel.FK_Course_Department(
CREATEREF(SchoolEntities.Departments, row(c.DepartmentID), SchoolModel.Department),
CREATEREF(SchoolEntities.Courses, row(c.CourseID)) )
FROM SchoolModelStoreContainer.Course AS c
</QueryView>
</AssociationSetMapping>
</EntityContainerMapping>
注释
可以定义查询视图来实现以下方案:
- 在概念模型中定义一个实体,该实体不包含存储模型中的实体的所有属性。 此实体包含的属性没有默认值且不支持 null 值。
- 将存储模型中计算的列映射到概念模型中实体类型的属性。
- 定义一个映射,其中用于对概念模型中的实体进行分区的条件不基于相等性。 在使用 Condition 元素指定条件映射时,所提供的条件必须等于指定的值。 有关详细信息,请参阅“Condition 元素 (MSL)”。
- 将存储模型中的同一列映射到概念模型中的多个类型。
- 将多个类型映射到同一个表。
- 在概念模型中定义不基于关系架构中的外键的关联。
- 使用自定义业务逻辑设置概念模型中的属性值。 例如,可将数据源中的字符串值“T”映射到概念模型中的 true 值(布尔值)。
- 为查询结果定义条件筛选器。
- 强制对概念模型中的数据施加比存储模型中更少的限制。 例如,可以使概念模型中的某个属性可为空,即使该属性映射到的列不支持 null 值也如此。
为实体定义查询视图时需要考虑以下注意事项:
- 查询视图是只读的。 只能使用修改函数来更新实体。
- 通过查询视图定义实体类型时,必须也通过查询视图来定义所有相关实体。
- 当多对多关联在存储模型中所映射到的实体表示关系架构中的链接表时,必须为此链接表在 AssociationSetMapping 元素中定义一个 QueryView 元素。
- 必须为类型层次结构中的所有类型定义查询视图。 可以使用下列方式来实现:
-
- 通过一个 QueryView 元素,该元素指定一个返回层次结构中所有实体类型的联合的实体 SQL 查询。
- 通过一个 QueryView 元素,该元素指定一个使用 CASE 运算符基于特定条件返回层次结构中特定实体类型的实体 SQL 查询。
- 通过一个附加 QueryView 元素,该元素在层次结构中表示某个特定类型。 在这种情况下,可使用 QueryView 元素的 TypeName 属性为每个视图指定实体类型。
- 定义查询视图时,不能在 EntitySetMapping 元素上指定 StorageSetName 属性。
- 定义查询视图时,EntitySetMapping 元素不能同时包含“属性”映射。
ResultBinding 元素 (MSL)
当将实体类型修改函数映射到基础数据库的存储过程时,以映射规范语言 (MSL) 表示的 ResultBinding 元素会将由存储过程返回的列值映射到概念模型中的实体属性。 例如,当插入存储过程返回标识列的值时,ResultBinding 元素会将返回的值映射到概念模型中的某个实体类型属性。
ResultBinding 元素可以是 InsertFunction 元素或 UpdateFunction 元素的子元素。
ResultBinding 元素不能具有任何子元素。
适用的属性
下表介绍适用于 ResultBinding 元素的属性:
属性名称 | 为必填 | 值 |
---|---|---|
Name | 是 | 概念模型中要映射的实体属性的名称。 |
ColumnName | 是 | 要映射的列的名称。 |
示例
下面的示例基于 School 模型,并显示用于将 Person 实体类型的 insert 函数映射到 InsertFunction 存储过程的 InsertFunction 元素。 (下面显示了 InsertPerson 存储过程并在存储模型中进行了声明。)ResultBinding 元素用于将存储过程 (NewPersonID) 返回的列值映射到实体类型属性 (PersonID)。
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate" />
<ScalarProperty Name="HireDate" ParameterName="HireDate" />
<ScalarProperty Name="FirstName" ParameterName="FirstName" />
<ScalarProperty Name="LastName" ParameterName="LastName" />
<ResultBinding Name="PersonID" ColumnName="NewPersonID" />
</InsertFunction>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
<ScalarProperty Name="PersonID" ParameterName="PersonID" />
</DeleteFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
下面的 Transact-SQL 描述了 InsertPerson 存储过程:
CREATE PROCEDURE [dbo].[InsertPerson]
@LastName nvarchar(50),
@FirstName nvarchar(50),
@HireDate datetime,
@EnrollmentDate datetime
AS
INSERT INTO dbo.Person (LastName,
FirstName,
HireDate,
EnrollmentDate)
VALUES (@LastName,
@FirstName,
@HireDate,
@EnrollmentDate);
SELECT SCOPE_IDENTITY() as NewPersonID;
ResultMapping 元素 (MSL)
当满足以下条件时,以映射规范语言 (MSL) 表示的 ResultMapping 元素会定义概念模型中的函数导入与基础数据库中的存储过程之间的映射:
- 函数导入返回一个概念模型实体类型或复杂类型。
- 存储过程返回的列的名称与实体类型或复杂类型中的属性名称不完全匹配。
默认情况下,存储过程返回的列与实体类型或复杂类型中的属性之间的映射基于列名称和属性名称。 如果列名称与属性名称不完全匹配,则必须使用 ResultMapping 元素定义映射。 有关默认映射的示例,请参阅“FunctionImportMapping 元素 (MSL)”。
ResultMapping 元素是 FunctionImportMapping 元素的一个子元素。
ResultMapping 元素可以具有以下子元素:
- EntityTypeMapping(零个或多个)
- ComplexTypeMapping
没有适用于 ResultMapping 元素的属性。
示例
请思考以下存储过程:
CREATE PROCEDURE [dbo].[GetGrades]
@student_Id int
AS
SELECT EnrollmentID as enroll_id,
Grade as grade,
CourseID as course_id,
StudentID as student_id
FROM dbo.StudentGrade
WHERE StudentID = @student_Id
另请考虑使用以下概念模型实体类型:
<EntityType Name="StudentGrade">
<Key>
<PropertyRef Name="EnrollmentID" />
</Key>
<Property Name="EnrollmentID" Type="Int32" Nullable="false"
annotation:StoreGeneratedPattern="Identity" />
<Property Name="CourseID" Type="Int32" Nullable="false" />
<Property Name="StudentID" Type="Int32" Nullable="false" />
<Property Name="Grade" Type="Decimal" Precision="3" Scale="2" />
</EntityType>
为创建返回前一个实体类型的实例的函数导入,必须在 ResultMapping 元素中定义存储过程返回的列与实体类型返回的列之间的映射:
<FunctionImportMapping FunctionImportName="GetGrades"
FunctionName="SchoolModel.Store.GetGrades" >
<ResultMapping>
<EntityTypeMapping TypeName="SchoolModel.StudentGrade">
<ScalarProperty Name="EnrollmentID" ColumnName="enroll_id"/>
<ScalarProperty Name="CourseID" ColumnName="course_id"/>
<ScalarProperty Name="StudentID" ColumnName="student_id"/>
<ScalarProperty Name="Grade" ColumnName="grade"/>
</EntityTypeMapping>
</ResultMapping>
</FunctionImportMapping>
ScalarProperty 元素 (MSL)
以映射规范语言 (MSL) 表示的 ScalarProperty 元素将概念模型实体类型、复杂类型或关联的属性映射到基础数据库中的表列或存储过程参数。
注意
将修改函数映射到其中的存储过程必须在存储模型中声明。 有关详细信息,请参阅函数元素 (SSDL)。
ScalarProperty 元素可以是以下元素的子元素:
- MappingFragment
- InsertFunction
- UpdateFunction
- DeleteFunction
- EndProperty
- ComplexProperty
- ResultMapping
作为 MappingFragment、ComplexProperty 或 EndProperty 元素的子元素,ScalarProperty 元素将概念模型中的属性映射到数据库中的列。 作为 InsertFunction、UpdateFunction 或 DeleteFunction 元素的子元素,ScalarProperty 元素将概念模型中的属性映射到存储过程参数。
ScalarProperty 元素不能具有任何子元素。
适用的属性
应用于 ScalarProperty 元素的属性各不相同,具体取决于元素的角色。
下表介绍在 ScalarProperty 元素用于将概念模型属性映射到数据库中的列时适用的属性:
属性名称 | 为必填 | 值 |
---|---|---|
Name | 是 | 要映射的概念模型属性的名称。 |
ColumnName | 是 | 要映射的表列的名称。 |
下表介绍在 ScalarProperty 元素用于将概念模型属性映射到存储过程参数时适用的属性:
属性名称 | 为必填 | 值 |
---|---|---|
Name | 是 | 要映射的概念模型属性的名称。 |
ParameterName | 是 | 正在映射的参数的名称。 |
Version | 否 | Current 或原始值,具体取决于是属性的当前值还是原始值用于并发检查。 |
示例
下面的示例演示 ScalarProperty 元素的两种用法:
- 将 Person 实体类型的属性映射到 Person 表的列。
- 将 Person 实体类型的属性映射到 UpdatePerson 存储过程的参数。 存储过程在存储模型中声明。
<EntitySetMapping Name="People">
<EntityTypeMapping TypeName="SchoolModel.Person">
<MappingFragment StoreEntitySet="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="HireDate" ColumnName="HireDate" />
<ScalarProperty Name="EnrollmentDate"
ColumnName="EnrollmentDate" />
</MappingFragment>
</EntityTypeMapping>
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate" />
<ScalarProperty Name="HireDate" ParameterName="HireDate" />
<ScalarProperty Name="FirstName" ParameterName="FirstName" />
<ScalarProperty Name="LastName" ParameterName="LastName" />
<ResultBinding Name="PersonID" ColumnName="NewPersonID" />
</InsertFunction>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
<ScalarProperty Name="PersonID" ParameterName="PersonID" />
</DeleteFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>
</EntitySetMapping>
示例
下一个示例显示了 ScalarProperty 元素,该元素用于将概念模型关联的 insert 和 delete 函数映射到数据库中的存储过程。 存储过程在存储模型中声明。
<AssociationSetMapping Name="CourseInstructor"
TypeName="SchoolModel.CourseInstructor"
StoreEntitySet="CourseInstructor">
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ColumnName="PersonID" />
</EndProperty>
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
</EndProperty>
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertCourseInstructor" >
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</InsertFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeleteCourseInstructor">
<EndProperty Name="Course">
<ScalarProperty Name="CourseID" ParameterName="courseId"/>
</EndProperty>
<EndProperty Name="Person">
<ScalarProperty Name="PersonID" ParameterName="instructorId"/>
</EndProperty>
</DeleteFunction>
</ModificationFunctionMapping>
</AssociationSetMapping>
UpdateFunction 元素 (MSL)
以映射规范语言 (MSL) 表示的 UpdateFunction 元素将概念模型中的实体类型的 update 函数映射到基础数据库中的存储过程。 将修改函数映射到其中的存储过程必须在存储模型中声明。 有关详细信息,请参阅函数元素 (SSDL)。
注意
如果没有将实体类型的 insert、update 或 delete 这三种操作全部映射到存储过程,则在运行时执行的情况下未映射的操作将失败且会引发 UpdateException。
UpdateFunction 元素可以为 ModificationFunctionMapping 元素的子元素,并可应用于 EntityTypeMapping 元素。
UpdateFunction 元素可以具有以下子元素:
- AssociationEnd(零个或多个)
- ComplexProperty(零个或多个)
- ResultBinding(零个或一个)
- ScalarProperty(零个或多个)
适用的属性
下表介绍可应用于 UpdateFunction 元素的属性。
属性名称 | 为必填 | 值 |
---|---|---|
FunctionName | 是 | 更新函数要映射到的存储过程的命名空间限定名称。 存储过程必须在存储模型中声明。 |
RowsAffectedParameter | 否 | 返回受影响行数的输出参数的名称。 |
示例
下面的示例基于 School 模型,并显示用于将 Person 实体类型的 update 函数映射到 UpdatePerson 存储过程的 UpdateFunction 元素。 UpdatePerson 存储过程在存储模型中声明。
<EntityTypeMapping TypeName="SchoolModel.Person">
<ModificationFunctionMapping>
<InsertFunction FunctionName="SchoolModel.Store.InsertPerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate" />
<ScalarProperty Name="HireDate" ParameterName="HireDate" />
<ScalarProperty Name="FirstName" ParameterName="FirstName" />
<ScalarProperty Name="LastName" ParameterName="LastName" />
<ResultBinding Name="PersonID" ColumnName="NewPersonID" />
</InsertFunction>
<UpdateFunction FunctionName="SchoolModel.Store.UpdatePerson">
<ScalarProperty Name="EnrollmentDate"
ParameterName="EnrollmentDate"
Version="Current" />
<ScalarProperty Name="HireDate" ParameterName="HireDate"
Version="Current" />
<ScalarProperty Name="FirstName" ParameterName="FirstName"
Version="Current" />
<ScalarProperty Name="LastName" ParameterName="LastName"
Version="Current" />
<ScalarProperty Name="PersonID" ParameterName="PersonID"
Version="Current" />
</UpdateFunction>
<DeleteFunction FunctionName="SchoolModel.Store.DeletePerson">
<ScalarProperty Name="PersonID" ParameterName="PersonID" />
</DeleteFunction>
</ModificationFunctionMapping>
</EntityTypeMapping>