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 中所參考之所有概念或儲存模型類型的名稱必須以它們各自的命名空間名稱來限定。 如需了解概念模型命名空間名稱,請參閱 Schema 元素 (CSDL)。 如需了解儲存體模型命名空間名稱,請參閱 Schema 元素 (SSDL)。
Alias 元素不能有子元素。
適用屬性
下表說明可套用至 Alias 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
索引鍵 | Yes | Value 屬性指定的命名空間的別名。 |
ReplTest1 | Yes | 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)
當概念模型的實體類型修改函式對應至基礎資料庫中的預存程序時,系統會使用對應規格語言的 AssociationEnd 元素。 如果修改的預存程序所採用參數的值保留在關聯屬性,AssociationEnd 元素會將屬性值對應至參數。 如需詳細資訊,請參閱下列範例。
如需詳細了解如何將實體類型修改函式對應至預存程序,請參閱 ModificationFunctionMapping 元素 (MSL) 和《逐步解說:將實體對應至預存程序》。
AssociationEnd 元素可以有以下子元素:
- ScalarProperty
適用屬性
下表說明適用於 AssociationEnd 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
AssociationSet | Yes | 要對應的關聯名稱。 |
從 | Yes | 對應到已對應關聯的導覽屬性的 FromRole 屬性值。 如需詳細資訊,請參閱 NavigationProperty 元素 (CSDL)。 |
目標 | Yes | 對應到已對應關聯的導覽屬性的 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
實體的更新函式對應到這個預存程序,您必須提供值給 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>
下列程式碼顯示 AssociationEnd 元素用於將 FK_Course_Department關聯的 DepartmentID 屬性對應至 UpdateCourse 預存程序 (Course 實體類型的更新函式所對應的程序):
<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 元素的 Entity SQL 字串,定義關聯和資料表欄之間的唯讀對應。
注意
如果為概念模型的關聯定義參考條件約束,則關聯不需要與 AssociationSetMapping 元素對應。 如果針對具有參考條件約束的關聯提供 AssociationSetMapping 元素,在 AssociationSetMapping 元素定義的對應就會遭到忽略。 如需詳細資訊,請參閱 ReferentialConstraint 元素 (CSDL)。
AssociationSetMapping 元素可以有以下子元素:
- QueryView (零個或一個)
- EndProperty (零個或兩個)
- Condition (零個或多個)
- ModificationFunctionMapping (零個或一個)
適用屬性
下表說明可套用至 AssociationSetMapping 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 要對應的概念模型關聯集名稱。 |
TypeName | No | 要對應的概念模型關聯類型之命名空間限定名稱。 |
StoreEntitySet | No | 要對應的資料表名稱。 |
範例
下列範例所示的 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 元素的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 概念模型中要對應的實體類型之複雜屬性的名稱。 |
TypeName | No | 概念模型屬性類型的命名空間限定名稱。 |
範例
下列範例是以 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 顯示 ComplexProperty 元素用於將 Name 屬性對應至基礎資料庫中的欄:
<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 | Yes | 要對應的複雜類型的命名空間限定名稱。 |
範例
請考慮下列預存程序:
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 子元素,則子 Condition 元素的所有條件都必須符合,MappingFragment 節點內定義的對應才有效。
每個條件都可以套用至 Name (以 Name 屬性指定的概念模型實體屬性名稱) 或 ColumnName (以 ColumnName 屬性指定的資料庫欄名稱)。 設定 Name 屬性後,系統會根據實體屬性值檢查條件。 設定 ColumnName 屬性後,系統會根據欄值檢查條件。 Condition 元素只能指定 Name 或 ColumnName 屬性兩者其一。
注意
如果 Condition 元素已使用在 FunctionImportMapping 元素內,則只有 Name 屬性不適用。
Condition 元素可以是以下元素的子系:
- AssociationSetMapping
- ComplexProperty
- EntitySetMapping
- MappingFragment
- EntityTypeMapping
Condition 元素不能有子元素。
適用屬性
下表說明適用於 Condition 元素的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
ColumnName | No | 其值用來評估條件之資料表資料行的名稱。 |
IsNull | No | True 或 False。 如果值為 True,且欄值為 Null,或值為 False 且欄值不是 Null,則條件為 true。 否則,條件不成立。 IsNull 和 Value 屬性無法同時使用。 |
ReplTest1 | No | 要與資料行值比較的值。 如果值相同,則條件成立。 否則,條件不成立。 IsNull 和 Value 屬性無法同時使用。 |
名稱 | No | 其值用來評估條件之概念模型實體屬性的名稱。 如果 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 元素會將概念模型中實體類型的刪除函式或關聯對應至基礎資料庫中的預存程序。 修改函式所對應的預存程序必須在儲存體模型中宣告。 如需詳細資訊,請參閱函式元素 (SSDL)。
注意
如果您並未將實體類型的插入、更新或刪除作業三者全部對應至預存程序,則在執行階段執行時擲回 UpdateException,未對應的作業就會失敗。
套用至 EntityTypeMapping 的 DeleteFunction
如果套用在 EntityTypeMapping 元素,DeleteFunction 元素會將概念模型的實體類型的刪除函式對應至預存程序。
套用至 EntityTypeMapping 元素時,DeleteFunction 元素可包含下列子元素:
- AssociationEnd (零個或多個)
- ComplexProperty (零個或多個)
- ScalarProperty (零個或多個)
適用屬性
下表說明 DeleteFunction 元素套用到 EntityTypeMapping 元素時,可套用到前者的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
FunctionName | Yes | 刪除函式所對應至之預存程序的命名空間限定名稱。 預存程序必須已宣告於儲存模型中。 |
RowsAffectedParameter | No | 會傳回受影響之資料列數的輸出參數名稱。 |
範例
下列範例是以 School 模型為基礎,並示範 DeleteFunction 元素將 Person 實體類型的刪除函式對應至 DeletePerson 預存程序。 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 元素時,會將概念模型的關聯刪除函式對應至預存程序。
DeleteFunction 套用至 AssociationSetMapping 元素時,可包含下列子元素:
- EndProperty
適用屬性
下表說明 DeleteFunction 元素套用到 AssociationSetMapping 元素時,可套用到前者的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
FunctionName | Yes | 刪除函式所對應至之預存程序的命名空間限定名稱。 預存程序必須已宣告於儲存模型中。 |
RowsAffectedParameter | No | 會傳回受影響之資料列數的輸出參數名稱。 |
範例
下列範例以 School 模型為基礎,示範將 DeleteFunction 元素用於對應 CourseInstructor 關聯的刪除函式到 DeleteCourseInstructor 預存程序。 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 元素的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 要對應的關聯端名稱。 |
範例
下列範例所示的 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>
範例
下列範例示範 EndProperty 元素將關聯 (CourseInstructor) 的插入和刪除函式對應至基礎資料庫的預存程序。 對應至的函式會在儲存體模型中宣告。
<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 | Yes | 要對應至的儲存模型實體容器名稱。 |
CdmEntityContainer | Yes | 要對應的概念模型實體容器名稱。 |
GenerateUpdateViews | No | 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 元素的 StoreEntitySet 屬性或 EntitySetMapping 元素本身所指定。
EntitySetMapping 元素可以有以下子元素:
- EntityTypeMapping (零個或多個)
- QueryView (零個或一個)
- MappingFragment (零個或多個)
適用屬性
下表說明可套用至 EntitySetMapping 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 要對應的概念模型實體集名稱。 |
TypeName 1 | No | 要對應的概念模型實體類型名稱。 |
StoreEntitySet 1 | No | 要對應至的儲存模型實體集名稱。 |
MakeColumnsDistinct | No | 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
- Condition
注意
MappingFragment 和 ModificationFunctionMapping 元素不能同時是 EntityTypeMapping 元素的子元素。
注意
如果 EntityTypeMapping 元素使用於 EntityTypeMapping 元素中,ScalarProperty 和 Condition 元素只能是前者的子元素。
適用屬性
下表說明可套用至 EntityTypeMapping 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
TypeName | Yes | 要對應的概念模型實體類型之命名空間限定名稱。 如果型別是抽象型別或衍生型別,值必須是 IsOfType(Namespace-qualified_type_name) 。 |
範例
下列範例示範的 EntitySetMapping 元素具有兩個子 EntityTypeMapping 元素。 在第一個 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) 和 Function 元素 (SSDL)。
注意
根據預設,如果函式匯入傳回概念模型實體類型或複雜型別,則基礎預存程序所傳回的資料行名稱必須與概念模型類型上的屬性名稱完全相符。 如果欄名稱與屬性名稱不完全相符,則對應必須在 ResultMapping 元素定義。
FunctionImportMapping 元素可以有以下子元素:
- ResultMapping (零個或多個)
適用屬性
下表說明適用於 FunctionImportMapping 元素的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
FunctionImportName | Yes | 概念模型中要對應的函式匯入名稱。 |
FunctionName | Yes | 儲存體模型中要對應的函式之命名空間限定名稱。 |
範例
下列範例是以 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)。
注意
如果您並未將實體類型的插入、更新或刪除作業三者全部對應至預存程序,則在執行階段執行時擲回 UpdateException,未對應的作業就會失敗。
InsertFunction 元素可能是 ModificationFunctionMapping 元素的子系,且可套用至 EntityTypeMapping 元素或 AssociationSetMapping 元素。
套用至 EntityTypeMapping 的 InsertFunction
如果套用在 EntityTypeMapping 元素,InsertFunction 元素會將概念模型的實體類型的插入函式對應至預存程序。
套用至 EntityTypeMapping 元素時,InsertFunction 元素可包含下列子元素:
- AssociationEnd (零個或多個)
- ComplexProperty (零個或多個)
- ResultBinding (零個或一個)
- ScalarProperty (零個或多個)
適用屬性
下表說明 InsertFunction 元素套用到 EntityTypeMapping 元素時,可套用到前者的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
FunctionName | Yes | 插入函式所對應至之預存程序的命名空間限定名稱。 預存程序必須已宣告於儲存模型中。 |
RowsAffectedParameter | No | 會傳回受影響之資料列數的輸出參數名稱。 |
範例
下列範例是以 School 模型為基礎,並示範 InsertFunction 元素用來將 Person 實體類型的插入函式對應至 InsertPerson 預存程序。 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
InsertPerson 元素套用至 AssociationSetMapping 元素時,會將概念模型的關聯插入函式對應至預存程序。
InsertPerson 套用至 AssociationSetMapping 元素時,可包含下列子元素:
- EndProperty
適用屬性
下表說明 InsertPerson 元素套用到 AssociationSetMapping 元素時,可套用到前者的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
FunctionName | Yes | 插入函式所對應至之預存程序的命名空間限定名稱。 預存程序必須已宣告於儲存模型中。 |
RowsAffectedParameter | No | 會傳回受影響之資料列數的輸出參數名稱。 |
範例
下列範例以 School 模型為基礎,示範將 InsertPerson 元素用於對應 CourseInstructor 關聯的插入函式到 InsertCourseInstructor 預存程序。 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 中所參考之概念及儲存模型類型的名稱必須以它們各自的命名空間名稱來限定。 如需了解概念模型命名空間名稱,請參閱 Schema 元素 (CSDL)。 如需了解儲存體模型命名空間名稱,請參閱 Schema 元素 (SSDL)。 MSL 使用的命名空間別名可以使用 Alias 元素來定義。
適用屬性
下表說明可套用至 Mapping 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
Space | Yes | C-S。 這是固定值,無法變更。 |
範例
下列範例示範的 Mapping 元素是以 School 模型的一部分為基礎。 如需 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 | Yes | 要對應的資料表或檢視之名稱。 |
MakeColumnsDistinct | No | 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 元素會將概念模型實體類型的插入、更新和刪除函式對應至基礎資料庫的預存程序。 ModificationFunctionMapping 元素也可以將概念模型的多對多關聯的插入和刪除函式對應至基礎資料庫的預存程序。 修改函式所對應的預存程序必須在儲存體模型中宣告。 如需詳細資訊,請參閱函式元素 (SSDL)。
注意
如果您並未將實體類型的插入、更新或刪除作業三者全部對應至預存程序,則在執行階段執行時擲回 UpdateException,未對應的作業就會失敗。
注意
如果繼承階層架構中某個實體的修改函式已對應至預存程序,則階層架構中所有類型的修改函式都必須對應至預存程序。
ModificationFunctionMapping 元素可以是 EntityTypeMapping 元素或 AssociationSetMapping 元素的子系。
ModificationFunctionMapping 元素可以擁有下列子元素:
- DeleteFunction (零個或一個)
- InsertFunction (零個或一個)
- UpdateFunction (零個或一個)
任何屬性都不適用於 ModificationFunctionMapping 元素。
範例
下列範例所示為 School 模型 People 實體集的實體集對應。 除了 Person 實體類型的欄對應之外,範例也示範了 Person 類型的插入、更新和刪除函式的對應。 對應至的函式會在儲存體模型中宣告。
<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 關聯的插入和刪除函式的對應。 對應至的函式會在儲存體模型中宣告。
<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)
對應規格語言的 QueryView 元素定義了概念模型的實體類型或關聯與基礎資料庫的資料表之間的唯讀對應。 對應是以對照儲存體模型所評估的 Entity SQL 查詢來定義,而您必須以概念模型的實體或關聯來表達結果集。 因為查詢檢視是唯讀的,無法使用標準更新命令來更新查詢檢視所定義的類型。 您可以使用修改函式來更新這些類型。 如需詳細資訊,請參閱《操作方法:將修改函式對應至預存程序》。
注意
在 QueryView 元素中,包含 GroupBy、群組匯總或導覽屬性的 Entity SQL 運算式不受支援。
QueryView 元素可以是 EntitySetMapping 元素或 AssociationSetMapping 元素的子系。 若是前者,查詢檢視會定義概念模型中之實體的唯讀對應。 若是後者,查詢檢視會定義概念模型中之關聯的唯讀對應。
注意
如果 AssociationSetMapping 元素用於具有參考條件約束的關聯,系統會忽略 AssociationSetMapping 元素。 如需詳細資訊,請參閱 ReferentialConstraint 元素 (CSDL)。
QueryView 元素不能有任何子元素。
適用屬性
下表說明可套用至 QueryView 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
TypeName | No | 要由查詢檢視對應的概念模型類型名稱。 |
範例
下列範例所示的 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 值,您還是可以將屬性設為可為 Null。
下列考量適用於為實體定義查詢檢視的情況:
- 查詢檢視是唯讀的。 您只能使用修改函式來更新這些實體。
- 當您依據查詢檢視定義實體類型時,也必須依據查詢檢視定義所有的相關實體。
- 如果您的多對多關聯對應的實體所在的儲存體模型代表關聯結構描述中的連結資料表,您必須定義此連結資料表的 AssociationSetMapping 元素的 QueryView 元素。
- 必須為類型階層架構中的所有類型定義查詢檢視。 您可以透過下列方式這樣做:
-
- 具有單一 QueryView 元素,會指定單一 Entity SQL 查詢來傳回階層中所有實體類型的聯集。
- 具有單一 QueryView 元素,會指定單一 Entity SQL 查詢來使用 CASE 運算子,根據特定條件在階層中傳回特定實體類型。
- 具有階層中特定類型的其他 QueryView 元素。 在此情況下,請使用 QueryView 元素的 TypeName 屬性指定每個檢視的實體類型。
- 定義查詢檢視後,您無法對 EntitySetMapping 元素指定 StorageSetName 屬性。
- 定義查詢檢視後,EntitySetMapping元素也不能包含 Property 對應。
ResultBinding 項目 (MSL)
對應規格語言 (MSL) 的 ResultBinding 元素會在實體類型修改函式已對應至基礎資料庫中的預存程序時,將預存程序傳回的欄值對應至概念模型中的實體屬性。 舉例來說,如果插入預存程序傳回身分識別欄的值,ResultBinding 元素會將傳回的值對應至概念模型中的實體類型屬性。
ResultBinding 元素可以是 InsertFunction 元素或 UpdateFunction 元素的子系。
ResultBinding 元素不能有任何子元素。
適用屬性
下表說明適用於 ResultBinding 元素的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 概念模型中要對應之實體屬性的名稱。 |
ColumnName | Yes | 要對應的資料行名稱。 |
範例
下列範例是以 School 模型為基礎,並示範 InsertFunction 元素用來將 Person 實體類型的插入函式對應至 InsertPerson 預存程序。 (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
ScalarProperty 元素是 MappingFragment、ComplexProperty 或 EndProperty 元素的子系時,會將概念模型的屬性對應至資料庫的欄。 ScalarProperty 元素是 InsertFunction、UpdateFunction 或 DeleteFunction 元素的子系時,會將概念模型的屬性對應至預存程序參數。
ScalarProperty 元素不能有任何子元素。
適用屬性
套用至 ScalarProperty 元素的屬性會根據元素的角色而不同。
下表說明 ScalarProperty 元素用來將概念模型屬性對應至資料庫的欄時,適用的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 要對應的概念模型屬性名稱。 |
ColumnName | Yes | 要對應的資料表資料行名稱。 |
下表說明 ScalarProperty 元素用於將概念模型屬性對應至預存程序參數時,適用的屬性:
屬性名稱 | 是必要的 | 值 |
---|---|---|
名稱 | Yes | 要對應的概念模型屬性名稱。 |
ParameterName | Yes | 要對應的參數名稱。 |
版本 | No | Current 或 Original 需視並行檢查應使用屬性目前的值或原始值而定。 |
範例
下列範例示範了以兩種方式使用的 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 元素用於將概念模型關聯的插入和刪除函式對應至資料庫的預存程序。 預存程序已宣告於儲存模型中。
<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 元素會將概念模型中實體類型的更新函式對應至基礎資料庫中的預存程序。 修改函式所對應的預存程序必須在儲存體模型中宣告。 如需詳細資訊,請參閱函式元素 (SSDL)。
注意
如果您並未將實體類型的插入、更新或刪除作業三者全部對應至預存程序,則在執行階段執行時擲回 UpdateException,未對應的作業就會失敗。
UpdateFunction 元素可能是 ModificationFunctionMapping 元素的子系,且套用至 EntityTypeMapping 元素。
UpdateFunction 元素可以有以下子元素:
- AssociationEnd (零個或多個)
- ComplexProperty (零個或多個)
- ResultBinding (零個或一個)
- ScalarProperty (零個或多個)
適用屬性
下表說明可套用至 UpdateFunction 元素的屬性。
屬性名稱 | 是必要的 | 值 |
---|---|---|
FunctionName | Yes | 更新函式所對應至之預存程序的命名空間限定名稱。 預存程序必須已宣告於儲存模型中。 |
RowsAffectedParameter | No | 會傳回受影響之資料列數的輸出參數名稱。 |
範例
下列範例是以 School 模型為基礎,並示範將 UpdateFunction 用於把 Person 實體類型的更新函式對應至 UpdatePerson 預存程序。 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>