MSL 仕様

マッピング仕様言語 (MSL) は、Entity Framework アプリケーションの概念モデルとストレージ モデル間のマッピングについて記述した XML ベースの言語です。

Entity Framework アプリケーションでは、マッピングのメタデータはビルド時に .msl ファイル (MSL で作成) から読み込まれます。 Entity Framework は、実行時のマッピング メタデータを使用して、概念モデルに対するクエリをストア固有のコマンドに変換します。

Entity Framework Designer (EF Designer) により、設計時にマッピング情報が .edmx ファイルに格納されます。 Entity Designer では、ビルド時に .edmx ファイルの情報を使用して .msl ファイルを作成します。これは、Entity Framework で実行時に必要になります。

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 要素に適用できる属性を示しています。

属性名 必要に応じて Value
Key はい Value 属性によって指定された名前空間のエイリアス。
Value はい Key 要素の値がエイリアスである名前空間。

次の例は、概念モデルで定義されている型にエイリアス c を定義する Alias 要素を示しています。

 <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 要素に適用できる属性を示しています。

属性名 必要に応じて Value
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 エンティティの更新関数をこのストアド プロシージャにマップするには、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 プロパティを (Course エンティティ型の更新関数のマップ先である) UpdateCourse ストアド プロシージャにマップするために使用される 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 要素は、2 つの EndProperty 要素を使用して、アソシエーション型プロパティとデータベース内の列の間のマッピングを定義します。 Condition 要素を使用して、これらのマッピングに条件を指定できます。 ModificationFunctionMapping 要素を使用して、アソシエーションの挿入関数、更新関数、および削除関数をデータベース内のストアド プロシージャにマップします。 QueryView 要素の Entity SQL 文字列を使用して、アソシエーションとテーブル列の間の読み取り専用のマッピングを定義します。

Note

概念モデルのアソシエーションに参照制約が定義されている場合は、AssociationSetMapping 要素を使用してアソシエーションをマップする必要はありません。 参照制約のあるアソシエーションに AssociationSetMapping 要素が存在する場合は、AssociationSetMapping 要素内で定義されたマッピングは無視されます。 詳細については、「ReferentialConstraint 要素 (CSDL)」を参照してください。

AssociationSetMapping 要素には、次の子要素を含めることができます。

  • QueryView (0 または 1 個)
  • EndProperty (0 または 2 個)
  • Condition (0 個以上)
  • ModificationFunctionMapping (0 または 1 個)

該当する属性

次の表では、AssociationSetMapping 要素に適用できる属性について説明します。

属性名 必要に応じて Value
名前 はい マップされる概念モデルのアソシエーション セットの名前です。
TypeName いいえ マッピングされている概念モデルのアソシエーション型の名前空間修飾名です。
StoreEntitySet いいえ マップされるテーブルの名前です。

次の例は、概念モデルの FK_Course_Department アソシエーション セットがデータベース内の Course テーブルにマップされた AssociationSetMapping 要素を示しています。 アソシエーション型のプロパティとテーブルの列の間のマッピングは、子の 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 (0 個以上)
  • ComplexProperty (0 個以上)
  • ComplextTypeMapping (0 個以上)
  • Condition (0 個以上)

該当する属性

次の表は、ComplexProperty 要素に適用できる属性を示しています。

属性名 必要に応じて Value
名前 はい マップされる概念モデルのエンティティ型の複合プロパティ名。
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 プロパティは、1 つの複合プロパティ、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 (0 個以上)

該当する属性

次の表は、ComplexTypeMapping 要素に適用できる属性を示しています。

属性名 必要に応じて Value
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 要素は、概念モデルと基になるデータベース間のマッピングに条件を設定します。 XML ノード内で定義されるマッピングは、子 Condition 要素で指定されたすべての条件を満たす場合に有効です。 それ以外の場合、マッピングは無効です。 たとえば、MappingFragment 要素に 1 つ以上の Condition 子要素が含まれている場合、MappingFragment ノード内で定義されるマッピングは、子の Condition 要素のすべての条件が満たされる場合にのみ有効になります。

各条件は Name (Name 属性で指定される概念モデル エンティティ プロパティの名前) か、または ColumnName (ColumnName 属性で指定されるデータベースの列名) のどちらかに適用できます。 Name 属性を設定すると、エンティティのプロパティ値に対して条件がチェックされます。 ColumnName 属性を設定すると、列値に対して条件がチェックされます。 Condition 要素で指定できるのは、Name 属性または ColumnName 属性のどちらかのみです。

Note

Condition 要素を FunctionImportMapping 要素内で使用した場合、Name 属性のみが適用されません。

Condition 要素は、次の要素の子にすることができます。

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

Condition 要素には、子要素を含めることはできません。

該当する属性

次の表は、Condition 要素に適用できる属性を示しています。

属性名 必要に応じて Value
[ColumnName] いいえ 条件の評価に使用される値のテーブル列の名前。
IsNull いいえ True または False です。 値が True で列値が Null の場合、または値が False で列値が Null でない場合、条件は True になります。 それ以外の場合、条件は False です。
IsNull 属性と Value 属性は同時に使用できません。
Value いいえ 列値と比較される値。 値が同じ場合、条件は True です。 それ以外の場合、条件は False です。
IsNull 属性と Value 属性は同時に使用できません。
名前 いいえ 条件の評価に使用される値を持つ概念モデルのエンティティ プロパティの名前。
Condition 要素が FunctionImportMapping 要素内で使用されている場合、この属性は適用されません。

次の例は、MappingFragment 要素の子としての Condition 要素を示しています。 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 要素は、概念モデル内のエンティティ型またはアソシエーションの削除関数を、基になるデータベースのストアド プロシージャにマップします。 変更関数のマップ先であるストアド プロシージャは、ストレージ モデル内で宣言する必要があります。 詳しくは、「Function 要素 (SSDL)」をご覧ください。

Note

エンティティ型の挿入、更新、および削除の 3 つの操作をすべてストアド プロシージャにマップしない場合、マップされていない操作は実行時に失敗して UpdateException がスローされます。

EntityTypeMapping への DeleteFunction の適用

DeleteFunction 要素は、EntityTypeMapping 要素に適用されると、概念モデル内のエンティティ型の削除関数をストアド プロシージャにマップします。

DeleteFunction 要素には、EntityTypeMapping 要素に適用する場合に、次の子要素を含めることができます。

  • AssociationEnd (0 個以上)
  • ComplexProperty (0 個以上)
  • ScalarProperty (0 個以上)

該当する属性

次の表は、EntityTypeMapping 要素に適用する場合に DeleteFunction 要素に適用できる属性を示しています。

属性名 必要に応じて Value
FunctionName はい 削除関数のマップ先となるストアド プロシージャの名前空間修飾名。 ストアド プロシージャはストレージ モデル内で宣言する必要があります。
RowsAffectedParameter いいえ 影響を受ける行の数を返す出力パラメーターの名前。

次の例は、School モデルに基づいており、Person エンティティ型の削除関数を 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 の適用

DeletePerson 要素は、AssociationSetMapping 要素に適用されると、概念モデル内のアソシエーションの削除関数をストアド プロシージャにマップします。

DeleteFunction 要素には、AssociationSetMapping 要素に適用する場合に、次の子要素を含めることができます。

  • EndProperty

該当する属性

次の表は、AssociationSetMapping 要素に適用する場合に DeleteFunction 要素に適用できる属性を示しています。

属性名 必要に応じて Value
FunctionName はい 削除関数のマップ先となるストアド プロシージャの名前空間修飾名。 ストアド プロシージャはストレージ モデル内で宣言する必要があります。
RowsAffectedParameter いいえ 影響を受ける行の数を返す出力パラメーターの名前。

次の例は、School モデルに基づいており、CourseInstructor アソシエーションの削除関数を 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 (0 個以上)

該当する属性

次の表は、EndProperty 要素に適用できる属性を示しています。

属性名 必要に応じて Value
名前 はい マップされるアソシエーション端の名前。

次の例は、概念モデルの FK_Course_Department アソシエーションがデータベース内の Course テーブルにマップされた AssociationSetMapping 要素を示しています。 アソシエーション型のプロパティとテーブルの列の間のマッピングは、子の 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) の挿入関数と削除関数を、基にデータベース内のストアド プロシージャにマッピングする 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 (0 個以上)
  • AssociationSetMapping (0 個以上)
  • FunctionImportMapping (0 個以上)

該当する属性

次の表では、EntityContainerMapping 要素に適用できる属性について説明します。

属性名 必要に応じて Value
StorageModelContainer はい マップされるストレージ モデルのエンティティ コンテナーの名前。
CdmEntityContainer はい マップされる概念モデルのエンティティ コンテナーの名前。
GenerateUpdateViews いいえ True または False です。 False の場合、更新ビューは生成されません。 この属性は、データが正常にラウンドトリップしないために無効になる読み取り専用マッピングがある場合、False に設定してください。
既定値は True です。

次の例は、SchoolModelEntities コンテナー (概念モデルのエンティティ コンテナー) を SchoolModelStoreContainer コンテナー (ストレージ モデルのエンティティ コンテナー) にマップする EntityContainerMapping 要素を示します。

 <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 (0 個以上)
  • QueryView (0 または 1 個)
  • MappingFragment (0 個以上)

該当する属性

次の表では、EntitySetMapping 要素に適用できる属性について説明します。

属性名 必要に応じて Value
名前 はい マッピングされている概念モデルのエンティティ セットの名前。
TypeName1 いいえ マッピングされている概念モデルのエンティティ型の名前。
StoreEntitySet1 いいえ マップ先のストレージ モデルのエンティティ セットの名前。
MakeColumnsDistinct いいえ 個別の行のみが返されるかどうかによって True または False
この属性が True に設定されている場合、EntityContainerMapping 要素の GenerateUpdateViews 属性を False に設定する必要があります。

 

1TypeName 属性と StoreEntitySet 属性を EntityTypeMapping 子要素と MappingFragment 子要素の代わりに使用して、単一エンティティ型を単一テーブルにマップすることができます。

次の例は、概念モデルの Courses エンティティ セットの 3 つの型 (1 つの基本型と 2 つの派生型) を基になるデータベースの 3 つの異なるテーブルにマップする EntitySetMapping 要素を示します。 テーブルは各 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 (0 個以上)
  • ModificationFunctionMapping (0 または 1 個)
  • ScalarProperty
  • 状態

Note

MappingFragment 要素と ModificationFunctionMapping要素を同時に EntityTypeMapping 要素の子要素にすることはできません。

Note

ScalarProperty 要素と Condition 要素は、FunctionImportMapping 要素内で使用される場合、EntityTypeMapping 要素の子要素にのみなることができます。

該当する属性

次の表では、EntityTypeMapping 要素に適用できる属性について説明します。

属性名 必要に応じて Value
TypeName はい マッピングされている概念モデルのエンティティ型の名前空間修飾名です。
型が抽象型または派生型である場合、値は IsOfType(Namespace-qualified_type_name) になる必要があります。

次の例は、2 つの EntityTypeMapping 子要素を持つ EntitySetMapping 要素を示しています。 最初の EntityTypeMapping 要素では、SchoolModel.Person エンティティ型は Person テーブルにマッピングされます。 2 番目の 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)」を参照してください。

Note

既定では、関数インポートが概念モデル エンティティ型または複合型を返す場合、基になるストアド プロシージャが返す列の名前が概念モデル型のプロパティの名前と正確に一致する必要があります。 列の名前がプロパティの名前と完全には一致しない場合は、ResultMapping 要素でマッピングを定義する必要があります。

FunctionImportMapping 要素には、次の子要素を含めることができます。

  • ResultMapping (0 個以上)

該当する属性

次の表は、FunctionImportMapping 要素に適用できる属性を示しています。

属性名 必要に応じて Value
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 要素は、概念モデル内のエンティティ型またはアソシエーションの挿入関数を、基になるデータベースのストアド プロシージャにマップします。 変更関数のマップ先であるストアド プロシージャは、ストレージ モデル内で宣言する必要があります。 詳しくは、「Function 要素 (SSDL)」をご覧ください。

Note

エンティティ型の挿入、更新、および削除の 3 つの操作をすべてストアド プロシージャにマップしない場合、マップされていない操作は実行時に失敗して UpdateException がスローされます。

InsertFunction 要素は、ModificationFunctionMapping 要素の子にすることができます。また、EntityTypeMapping 要素または AssociationSetMapping 要素に適用できます。

EntityTypeMapping への InsertFunction の適用

InsertFunction 要素は、EntityTypeMapping 要素に適用されると、概念モデル内のエンティティ型の挿入関数をストアド プロシージャにマップします。

InsertFunction 要素には、EntityTypeMapping 要素に適用する場合に、次の子要素を含めることができます。

  • AssociationEnd (0 個以上)
  • ComplexProperty (0 個以上)
  • ResultBinding (0 または 1 個)
  • ScalarProperty (0 個以上)

該当する属性

次の表は、EntityTypeMapping 要素に適用する場合に InsertFunction 要素に適用できる属性を示しています。

属性名 必要に応じて Value
FunctionName はい 挿入関数のマップ先であるストアド プロシージャの名前空間修飾名。 ストアド プロシージャはストレージ モデル内で宣言する必要があります。
RowsAffectedParameter いいえ 影響を受ける行の数を返す出力パラメーターの名前。

次の例は、School モデルに基づいており、Person エンティティ型の挿入関数を InsertPerson ストアド プロシージャにマップするために使用される 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

該当する属性

次の表は、AssociationSetMapping 要素に適用する場合に InsertFunction 要素に適用できる属性を示しています。

属性名 必要に応じて Value
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 (0 個以上)
  • EntityContainerMapping (1 個)

MSL で参照される概念モデル型およびストレージ モデル型の名前は、それぞれの名前空間名で修飾する必要があります。 概念モデルの名前空間名の詳細については、「Schema 要素 (CSDL)」を参照してください。 ストレージ モデルの名前空間名の詳細については、「Schema 要素 (SSDL)」を参照してください。 MSL で使用される名前空間の別名は、Alias 要素で定義できます。

該当する属性

次の表は、Mapping 要素に適用できる属性を示しています。

属性名 必要に応じて Value
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 (0 個以上)
  • ScalarProperty (0 個以上)
  • Condition (0 個以上)

該当する属性

次の表では、MappingFragment 要素に適用できる属性について説明します。

属性名 必要に応じて Value
StoreEntitySet はい マップされるテーブルまたはビューの名前。
MakeColumnsDistinct いいえ 個別の行のみが返されるかどうかによって True または False
この属性が True に設定されている場合、EntityContainerMapping 要素の GenerateUpdateViews 属性を False に設定する必要があります。

次の例は、EntityTypeMapping 要素の子としての MappingFragment 要素を示しています。 この例では、概念モデル内の 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>

次の例は、EntitySetMapping 要素の子としての MappingFragment 要素を示しています。 上の例では、概念モデル内の 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 要素では、概念モデルの多対多のアソシエーションの挿入関数と削除関数を、基になるデータベース内のストアド プロシージャにマップすることもできます。 変更関数のマップ先であるストアド プロシージャは、ストレージ モデル内で宣言する必要があります。 詳しくは、「Function 要素 (SSDL)」をご覧ください。

Note

エンティティ型の挿入、更新、および削除の 3 つの操作をすべてストアド プロシージャにマップしない場合、マップされていない操作は実行時に失敗して UpdateException がスローされます。

Note

継承階層の 1 つのエンティティの変更関数をストアド プロシージャにマップした場合、階層内のすべての型の変更関数がストアド プロシージャにマップされる必要があります。

ModificationFunctionMapping 要素は、EntityTypeMapping 要素または AssociationSetMapping 要素の子にすることができます。

ModificationFunctionMapping 要素には、次の子要素を含めることができます。

  • DeleteFunction (0 または 1 個)
  • InsertFunction (0 または 1 個)
  • UpdateFunction (0 または 1 個)

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)

マッピング仕様言語 (MSL) の QueryView 要素は、概念モデルのエンティティ型またはアソシエーションと、基になるデータベースのテーブルとの間の読み取り専用のマッピングを定義します。 このマッピングは、ストレージ モデルに対して評価される Entity SQL クエリで定義されます。また、結果セットは、概念モデルのエンティティまたはアソシエーションに従って表されます。 クエリ ビューは読み取り専用であるため、標準の更新コマンドを使用してクエリ ビューで定義された型を更新することはできません。 型の更新を行うには、変更関数を使用する必要があります。 詳細については、変更関数をストアド プロシージャにマップする方法に関する記事を参照してください。

Note

QueryView 要素では、GroupBy、グループ集計、またはナビゲーション プロパティを含む Entity SQL 式がサポートされていません。

 

QueryView 要素は、EntitySetMapping 要素または AssociationSetMapping 要素の子である場合があります。 前者の場合、クエリ ビューは、概念モデルのエンティティの読み取り専用マッピングを定義します。 後者の場合、クエリ ビューは、概念モデルのアソシエーションの読み取り専用マッピングを定義します。

Note

参照制約のあるアソシエーションに対する AssociationSetMapping 要素である場合は、AssociationSetMapping 要素は無視されます。 詳細については、「ReferentialConstraint 要素 (CSDL)」を参照してください。

QueryView 要素には、子要素を含めることはできません。

該当する属性

QueryView 要素に適用できる属性を次の表に示します。

属性名 必要に応じて Value
TypeName いいえ クエリ ビューによってマップされる概念モデル型の名前。

次の例は、EntitySetMapping 要素の子である QueryView 要素を示し、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>

次の例は、AssociationSetMapping 要素の子である QueryView 要素を示し、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 の値 (Boolean) にマップすることもできます。
  • クエリ結果に対する条件付きフィルターを定義する。
  • 概念モデルのデータに適用する制限をストレージ モデルよりも少なくする。 たとえば、概念モデルのプロパティについて、マップ先の列で Null 値がサポートされなくても、Null 値が許容されるプロパティにすることもできます。

エンティティのクエリ ビューを定義する際は、次の点に注意してください。

  • クエリ ビューは読み取り専用です。 エンティティの更新を行うには、変更関数を使用する必要があります。
  • クエリ ビューでエンティティ型を定義する場合、すべての関連エンティティもクエリ ビューで定義する必要があります。
  • リレーショナル スキーマのリンク テーブルを表すストレージ モデルのエンティティに多対多のアソシエーションをマップする場合、このリンク テーブルの AssociationSetMapping 要素の QueryView 要素を定義する必要があります。
  • クエリ ビューは、型階層のすべての型に対して定義する必要があります。 これは次の方法で実行できます。
    • 単一の QueryView 要素を使用し、その要素で、階層のすべてのエンティティ型の和集合を返す単一の Entity SQL クエリを指定します。
    • 単一の QueryView 要素を使用し、その要素で、CASE 演算子を使用して特定の条件に基づいて階層の特定のエンティティ型を返す単一の Entity SQL クエリを指定します。
    • 階層の特定の型に対して追加の QueryView 要素を使用します。 この場合、QueryView 要素の TypeName 属性を使用して、各ビューのエンティティ型を指定します。
  • クエリ ビューを定義するときに、EntitySetMapping 要素の StorageSetName 属性を指定することはできません。
  • クエリ ビューを定義するときに、EntitySetMapping 要素に Property マッピングを含めることもできません。

ResultBinding 要素 (MSL)

マッピング仕様言語 (MSL) の ResultBinding 要素は、エンティティ型の変更関数が基になるデータベース内のストアド プロシージャにマップされている場合、ストアド プロシージャから返される列値を概念モデルのエンティティ プロパティにマップします。 たとえば、ID 列の値が挿入ストアド プロシージャから返されると、ResultBinding 要素は、戻り値を概念モデルのエンティティ型プロパティにマップします。

ResultBinding 要素は、InsertFunction 要素または UpdateFunction 要素の子にすることができます。

ResultBinding 要素には、子要素を含めることはできません。

該当する属性

次の表は、ResultBinding 要素に適用できる属性を示しています。

属性名 必要に応じて Value
名前 はい マップされる概念モデルのエンティティ プロパティの名前。
[ColumnName] はい マップされる列の名前。

次の例は、School モデルに基づいており、Person エンティティ型の挿入関数を InsertPerson ストアド プロシージャにマップするために使用される 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 (0 個以上)
  • 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 要素は、概念モデルのエンティティ型、複合型、またはアソシエーションのプロパティを、基になるデータベースのテーブル列またはストアド プロシージャ パラメーターにマップします。

Note

変更関数のマップ先であるストアド プロシージャは、ストレージ モデル内で宣言する必要があります。 詳しくは、「Function 要素 (SSDL)」をご覧ください。

ScalarProperty 要素は、次の要素の子にすることができます。

  • MappingFragment
  • InsertFunction
  • UpdateFunction
  • DeleteFunction
  • EndProperty
  • ComplexProperty
  • ResultMapping

MappingFragment 要素、ComplexProperty 要素、または EndProperty 要素の子としての ScalarProperty 要素は、概念モデルのプロパティをデータベースの列にマップします。 InsertFunction 要素、UpdateFunction 要素、または DeleteFunction 要素の子としての ScalarProperty 要素は、概念モデルのプロパティをストアド プロシージャのパラメーターにマップします。

ScalarProperty 要素には、どの子要素も含めることはできません。

該当する属性

ScalarProperty 要素に適用できる属性は、要素の役割によって異なります。

次の表で、ScalarProperty 要素を使用して概念モデルのプロパティをデータベースの列にマップしたときに適用可能な属性について説明します。

属性名 必要に応じて Value
名前 はい マップされる概念モデルのプロパティの名前。
[ColumnName] はい マップされるテーブル列の名前。

次の表で、ScalarProperty 要素を使用して概念モデルのプロパティをストアド プロシージャ パラメーターにマップしたときに適用可能な属性について説明します。

属性名 必要に応じて Value
名前 はい マップされる概念モデルのプロパティの名前。
ParameterName はい マップされるパラメーターの名前。
バージョン いいえ コンカレンシー チェックにプロパティの現在の値を使用するか、元の値を使用するかにより、Current または Original

次の例は ScalarProperty 要素を使用する 2 つの方法を示しています。

  • 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 要素は、概念モデルのエンティティ型の更新関数を基になるデータベースのストアド プロシージャにマップします。 変更関数のマップ先であるストアド プロシージャは、ストレージ モデル内で宣言する必要があります。 詳しくは、「Function 要素 (SSDL)」をご覧ください。

Note

エンティティ型の挿入、更新、および削除の 3 つの操作をすべてストアド プロシージャにマップしない場合、マップされていない操作は実行時に失敗して UpdateException がスローされます。

UpdateFunction 要素は ModificationFunctionMapping 要素の子になることができ、EntityTypeMapping 要素に適用できます。

UpdateFunction 要素には、次の子要素を含めることができます。

  • AssociationEnd (0 個以上)
  • ComplexProperty (0 個以上)
  • ResultBinding (0 または 1 個)
  • ScalarProperty (0 個以上)

該当する属性

次の表では、UpdateFunction 要素に適用できる属性について説明します。

属性名 必要に応じて Value
FunctionName はい 更新関数のマップ先となるストアド プロシージャの名前空間修飾名。 ストアド プロシージャはストレージ モデル内で宣言する必要があります。
RowsAffectedParameter いいえ 影響を受ける行の数を返す出力パラメーターの名前。

次の例は、School モデルに基づいており、Person エンティティ型の更新関数を 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>