Share via


Spécification MSL

Le langage MSL (Mapping Specification Language) est un langage XML qui décrit le mappage entre le modèle conceptuel et le modèle de stockage d’une application Entity Framework.

Dans une application Entity Framework, les métadonnées de mappage sont chargées à partir d’un fichier .msl (écrit en MSL) au moment de la génération. Entity Framework utilise des métadonnées de mappage au moment de l’exécution pour traduire des requêtes sur le modèle conceptuel en commandes spécifiques au magasin.

Entity Framework Designer (EF Designer) stocke les informations de mappage dans un fichier .edmx au moment du design. Au moment de la génération, le Concepteur d’entités utilise des informations dans un fichier .edmx pour créer le fichier .msl nécessaire par Entity Framework au moment de l’exécution

Les noms de tous les types de modèle conceptuel et de stockage référencés en MSL doivent être qualifiés par le nom de leur espace de noms respectif. Pour plus d’informations sur le nom de l’espace de noms du modèle conceptuel, consultez spécification CSDL. Pour plus d’informations sur le nom de l’espace de noms du modèle de stockage, consultez spécification SSDL.

Les versions de MSL sont différenciées par les espaces de noms XML.

MSL Version Espace de noms 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

Élément Alias (MSL)

L’élément Alias dans le langage de spécification de mappage (MSL) est un enfant de l’élément Mappage utilisé pour définir des alias pour les espaces de noms de modèle conceptuel et de modèle de stockage. Les noms de tous les types de modèle conceptuel et de stockage référencés en MSL doivent être qualifiés par le nom de leur espace de noms respectif. Pour plus d’informations sur le nom de l’espace de noms du modèle conceptuel, consultez Schema Element (CSDL). Pour plus d’informations sur le nom de l’espace de noms du modèle de stockage, consultez l’élément de schéma (SSDL).

L’élément Alias ne peut pas avoir d’éléments enfants.

Attributs applicables

Le tableau ci-dessous décrit les attributs qui peuvent être appliqués à l’élément Alias.

Nom de l’attribut Est obligatoire Valeur
Clé Oui Alias de l’espace de noms spécifié par l’attribut Value.
Valeur Oui Espace de noms pour lequel la valeur de l’élément Clé est un alias.

Exemple

L’exemple suivant montre un élément Alias qui définit un alias, c, pour les types définis dans le modèle conceptuel.

 <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, élément (MSL)

L’élément AssociationEnd dans le langage de spécification de mappage (MSL) est utilisé lorsque les fonctions de modification d’un type d’entité dans le modèle conceptuel sont mappées aux procédures stockées dans la base de données sous-jacente. Si une procédure stockée de modification prend un paramètre dont la valeur est conservée dans une propriété d’association, l’élément AssociationEnd mappe la valeur de propriété au paramètre. Pour plus d'informations, voir l'exemple ci-dessous.

Pour plus d’informations sur le mappage des fonctions de modification des types d’entités aux procédures stockées, consultez ModificationFunctionMapping, élément (MSL) et procédure pas à pas : mappage d’une entité à des procédures stockées.

L’élément AssociationEnd peut avoir les éléments enfants suivants :

  • ScalarProperty

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément AssociationEnd.

Nom de l’attribut Est obligatoire Valeur
AssociationSet Oui Nom de l'association mappée.
De Oui Valeur de l’attribut FromRole de la propriété de navigation qui correspond à l’association mappée. Pour plus d’informations, consultez NavigationProperty, élément (CSDL).
Pour Oui Valeur de l’attribut ToRole de la propriété de navigation qui correspond à l’association mappée. Pour plus d’informations, consultez NavigationProperty, élément (CSDL).

Exemple

Considérons le type d'entité de modèle conceptuel suivant :

 <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>

Considérons également la procédure stockée suivante :

 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;

Pour mapper la fonction de mise à jour de l’entité Course à cette procédure stockée, vous devez fournir une valeur au paramètre DepartmentID. La valeur pour DepartmentID ne correspond pas à une propriété sur le type d'entité ; elle est contenue dans une association indépendante dont le mappage est indiqué ici :

 <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>

Le code suivant montre l’élément AssociationEnd utilisé pour mapper la propriété DepartmentID de l’association FK_Course_Department à la procédure stockée UpdateCourse (à laquelle la fonction de mise à jour du type d’entité Course est mappée) :

 <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, élément (MSL)

L’élément AssociationSetMapping dans le langage de spécification de mappage (MSL) définit le mappage entre une association dans le modèle conceptuel et les colonnes de table de la base de données sous-jacente.

Les associations dans le modèle conceptuel sont des types dont les propriétés représentent des colonnes de clé primaire et de clé étrangère dans la base de données sous-jacente. L’élément AssociationSetMapping utilise deux éléments EndProperty pour définir les mappages entre les propriétés de type d’association et les colonnes de la base de données. Vous pouvez placer des conditions sur ces mappages avec l’élément Condition. Mappez les fonctions d'insertion, de mise à jour et de suppression pour les associer aux procédures stockées dans la base de données avec l'élément ModificationFunctionMapping. Définissez des mappages en lecture seule entre les associations et les colonnes de table à l’aide d’une chaîne Entity SQL dans un élément QueryView.

Remarque

Si une contrainte référentielle est définie pour une association dans le modèle conceptuel, l’association n’a pas besoin d’être mappée avec un élément AssociationSetMapping . Si un élément AssociationSetMapping est présent pour une association qui a une contrainte référentielle, les mappages définis dans l’élément AssociationSetMapping sont ignorés. Pour plus d’informations, consultez l’élément ReferentialConstraint (CSDL).

L’élément AssociationSetMapping peut avoir les éléments enfants suivants

  • QueryView (zéro ou un élément)
  • EndProperty (zéro ou deux éléments)
  • Condition (zéro, un ou plusieurs éléments)
  • ModificationFunctionMapping (zéro ou un élément)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément AssociationSetMapping .

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom de l'ensemble d'associations du modèle conceptuel mappé.
TypeName Non Nom qualifié par un espace de noms du type d'association du modèle conceptuel mappé.
StoreEntitySet Non Nom de la table mappée.

Exemple

L’exemple suivant montre un élément AssociationSetMapping dans lequel l’association FK_Course_Department définie dans le modèle conceptuel est mappée à la table Course dans la base de données. Les mappages entre les propriétés de type d’association et les colonnes de table sont spécifiés dans les éléments 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, élément (MSL)

Un élément ComplexProperty dans le langage de spécification de mappage (MSL) définit le mappage entre une propriété de type complexe sur un type d’entité de modèle conceptuel et des colonnes de table dans la base de données sous-jacente. Les mappages de colonnes de propriété sont spécifiés dans des éléments ScalarProperty enfants.

L’élément de propriété ComplexType peut avoir les éléments enfants suivants :

  • ScalarProperty (zéro ou plus)
  • ComplexProperty (zéro ou plus)
  • ComplexTypeMapping (zéro ou plus)
  • Condition (zéro, un ou plusieurs éléments)

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément ComplexProperty :

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom de la propriété complexe d'un type d'entité dans le modèle conceptuel mappé.
TypeName Non Nom qualifié par un espace de noms du type de propriété de modèle conceptuel.

Exemple

L'exemple suivant est basé sur le modèle School. Le type complexe suivant a été ajouté au modèle conceptuel :

 <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>

Les propriétés LastName et FirstName du type d’entité Person ont été remplacées par une propriété complexe 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>

Le MSL suivant montre l’élément ComplexProperty utilisé pour mapper la propriété Name aux colonnes de la base de données sous-jacente :

 <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, élément (MSL)

L’élément ComplexTypeMapping dans le langage de spécification de mappage (MSL) est un enfant de l’élément ResultMapping et définit le mappage entre une importation de fonction dans le modèle conceptuel et une procédure stockée dans la base de données sous-jacente lorsque les éléments suivants sont vrais :

  • L'importation de fonction retourne un type complexe conceptuel.
  • Les noms de colonne retournés par la procédure stockée ne correspondent pas exactement aux noms de propriété du type complexe.

Par défaut, le mappage entre les colonnes retournées par une procédure stockée et un type complexe est basé sur les noms de colonne et de propriété. Si les noms de colonnes ne correspondent pas exactement aux noms de propriétés, vous devez utiliser l’élément ComplexTypeMapping pour définir le mappage. Pour obtenir un exemple de mappage par défaut, consultez FunctionImportMapping, élément (MSL).

L’élément ComplexTypeMapping peut avoir les éléments enfants suivants :

  • ScalarProperty (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément ComplexTypeMapping.

Nom de l’attribut Est obligatoire Valeur
TypeName Oui Nom qualifié par un espace de noms du type complexe mappé.

Exemple

Examinez la procédure stockée suivante :

 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

De même, considérons le type complexe de modèle conceptuel suivant :

 <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>

Pour créer une importation de fonction qui retourne des instances du type complexe précédent, le mappage entre les colonnes retournées par la procédure stockée et le type d’entité doit être défini dans un élément 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, élément (MSL)

L’élément Condition dans le langage de spécification de mappage (MSL) place les conditions sur les mappages entre le modèle conceptuel et la base de données sous-jacente. Le mappage défini dans un nœud XML est valide si toutes les conditions, telles que spécifiées dans les éléments enfant, sont remplies. À défaut, le mappage n'est pas valide. Par exemple, si un élément MappingFragment contient un ou plusieurs éléments Condition enfants, le mappage défini dans le nœud MappingFragment ne sera valide que si toutes les conditions des éléments Condition enfant sont remplies.

Chaque condition peut s’appliquer à une Name (nom d’une propriété d’entité de modèle conceptuel, spécifiée par l’attribut Name ) ou à un ColumnName (nom d’une colonne dans la base de données, spécifié par l’attribut ColumnName). Lorsque l’attribut Name est défini, la condition est vérifiée par rapport à une valeur de propriété d’entité. Lorsque l’attribut ColumnName est défini, la condition est vérifiée par rapport à une valeur de colonne. Un seul attribut Name ou ColumnName peut être spécifié dans un élément Condition .

Remarque

Lorsque l’élément Condition est utilisé dans un élément FunctionImportMapping, seul l’attribut Name n’est pas applicable.

L’élément Condition peut être un enfant des éléments suivants :

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

L’élément Condition ne peut pas avoir d’éléments enfants.

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément Condition :

Nom de l’attribut Est obligatoire Valeur
ColumnName Non Nom de la colonne de table dont la valeur est utilisée pour évaluer la condition.
IsNull Non True ou False. Si la valeur est True et que la valeur de colonne est null, ou si la valeur est False et que la valeur de colonne n’est pas null, la condition est true. Sinon, la condition n'est pas vérifiée (False).
Les attributs IsNull et Value ne peuvent pas être utilisés en même temps.
Valeur Non Valeur à laquelle la valeur de colonne est comparée. Si les valeurs sont identiques, la condition est vérifiée (True). Sinon, la condition n'est pas vérifiée (False).
Les attributs IsNull et Value ne peuvent pas être utilisés en même temps.
Nom Non Nom de la propriété d'entité de modèle conceptuel dont la valeur est utilisée pour évaluer la condition.
Cet attribut n’est pas applicable si l’élément Condition est utilisé dans un élément FunctionImportMapping.

Exemple

L’exemple suivant montre éléments Condition en tant qu’enfants d’éléments MappingFragment . Lorsque HireDate n’est pas null et EnrollmentDate a la valeur Null, les données sont mappées entre le type SchoolModel.Instructor et les colonnes PersonID et HireDate de la table Person. Lorsque EnrollmentDate n’est pas null et HireDate a la valeur Null, les données sont mappées entre le type SchoolModel.Student et le PersonID et les colonnes d’inscription de la table Person.

 <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, élément (MSL)

L’élément DeleteFunction dans le langage de spécification de mappage (MSL) mappe la fonction de suppression d’un type d’entité ou d’une association dans le modèle conceptuel à une procédure stockée dans la base de données sous-jacente. Les procédures stockées auxquelles des fonctions de modification sont mappées doivent être déclarées dans le modèle de stockage. Pour plus d’informations, consultez Function (élément) (SSDL).

Remarque

Si vous ne mappez pas les trois opérations d’insertion, de mise à jour ou de suppression d’un type d’entité aux procédures stockées, les opérations non mappées échouent si elles sont exécutées au moment de l’exécution et qu’une exception UpdateException est levée.

Application de DeleteFunction à EntityTypeMapping

Lorsqu’il est appliqué à l’élément EntityTypeMapping, l’élément DeleteFunction mappe la fonction delete d’un type d’entité dans le modèle conceptuel à une procédure stockée.

L’élément DeleteFunction peut avoir les éléments enfants suivants lorsqu’il est appliqué à un élément EntityTypeMapping :

  • AssociationEnd (zéro, un ou plusieurs éléments)
  • ComplexProperty (zéro, un ou plusieurs éléments)
  • ScalarProperty (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément DeleteFunction lorsqu’il est appliqué à un élément EntityTypeMapping .

Nom de l’attribut Est obligatoire Valeur
FunctionName Oui Nom qualifié par un espace de noms de la procédure stockée à laquelle la fonction de suppression est mappée. La procédure stockée doit être déclarée dans le modèle de stockage.
RowsAffectedParameter Non Nom du paramètre de sortie qui retourne le nombre de lignes affectées.

Exemple

L’exemple suivant est basé sur le modèle School et montre l’élément DeleteFunction mappant la fonction de suppression du type d’entité Person au DeletePerson procédure stockée. La procédure stockée DeletePerson est déclarée dans le modèle de stockage.

 <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>

Application de DeleteFunction à AssociationSetMapping

Lorsqu’il est appliqué à l’élément AssociationSetMapping, l’élément DeleteFunction mappe la fonction de suppression d’une association dans le modèle conceptuel à une procédure stockée.

L’élément DeleteFunction peut avoir les éléments enfants suivants lorsqu’il est appliqué à l’élément AssociationSetMapping :

  • EndProperty

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément DeleteFunction lorsqu’il est appliqué à l’élément AssociationSetMapping.

Nom de l’attribut Est obligatoire Valeur
FunctionName Oui Nom qualifié par un espace de noms de la procédure stockée à laquelle la fonction de suppression est mappée. La procédure stockée doit être déclarée dans le modèle de stockage.
RowsAffectedParameter Non Nom du paramètre de sortie qui retourne le nombre de lignes affectées.

Exemple

L’exemple suivant est basé sur le modèle School et montre l’élément DeleteFunction utilisé pour mapper la fonction delete de l’association CourseInstructor à la procédure stockée DeleteCourseInstructor. Le DeleteCourseInstructor procédure stockée est déclaré dans le modèle de stockage.

 <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, élément (MSL)

L’élément EndProperty dans le langage de spécification de mappage (MSL) définit le mappage entre une fin ou une fonction de modification d’une association de modèle conceptuel et de la base de données sous-jacente. Le mappage de colonne de propriété est spécifié dans un élément ScalarProperty enfant.

Lorsqu’un élément EndProperty est utilisé pour définir le mappage pour la fin d’une association de modèle conceptuel, il s’agit d’un enfant d’un élément AssociationSetMapping. Lorsque l’élément EndProperty est utilisé pour définir le mappage d’une fonction de modification d’une association de modèle conceptuel, il s’agit d’un enfant d’un élément InsertFunction ou d’un élément DeleteFunction.

L’élément EndProperty peut avoir les éléments enfants suivants :

  • ScalarProperty (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément EndProperty :

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom de la terminaison d'association mappée.

Exemple

L’exemple suivant montre un élément AssociationSetMapping dans lequel l’association FK_Course_Department dans le modèle conceptuel est mappée à la table Course de la base de données. Les mappages entre les propriétés de type d’association et les colonnes de table sont spécifiés dans les éléments 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>

Exemple

L’exemple suivant montre l’élément EndProperty mapper les fonctions d’insertion et de suppression d’une association (CourseInstructor) aux procédures stockées dans la base de données sous-jacente. Les fonctions mappées sont déclarées dans le modèle de stockage.

 <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, élément (MSL)

L’élément EntityContainerMapping dans le langage de spécification de mappage (MSL) mappe le conteneur d’entités dans le modèle conceptuel au conteneur d’entités dans le modèle de stockage. L’élément EntityContainerMapping est un enfant de l’élément Mapping.

L’élément EntityContainerMapping peut avoir les éléments enfants suivants (dans l’ordre répertorié) :

  • EntitySetMapping (zéro ou plus)
  • AssociationSetMapping (zéro ou plus)
  • FunctionImportMapping (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément EntityContainerMapping .

Nom de l’attribut Est obligatoire Valeur
StorageModelContainer Oui Nom du conteneur d'entités de modèle de stockage mappé.
CdmEntityContainer Oui Nom du conteneur d'entités de modèle conceptuel mappé.
GenerateUpdateViews Non True ou False. Si false, aucune vue de mise à jour n’est générée. Cet attribut doit être défini sur False lorsque vous disposez d’un mappage en lecture seule qui n’est pas valide, car les données peuvent ne pas aller-retour correctement.
La valeur par défaut est True.

Exemple

L’exemple suivant montre un élément EntityContainerMapping qui mappe le conteneur SchoolModelEntities (conteneur d’entité de modèle conceptuel) au conteneur SchoolModelStoreContainer (conteneur d’entité de modèle de stockage) :

 <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, élément (MSL)

L’élément EntitySetMapping dans le langage de spécification de mappage (MSL) mappe tous les types d’une entité de modèle conceptuel définie sur des jeux d’entités dans le modèle de stockage. Un jeu d’entités dans le modèle conceptuel est un conteneur logique pour les instances d’entités du même type (et les types dérivés). Un jeu d’entités dans le modèle de stockage représente une table ou une vue dans la base de données sous-jacente. L’ensemble d’entités de modèle conceptuel est spécifié par la valeur de l’attribut Name de l’élément EntitySetMapping . La table ou la vue mappée est spécifiée par l’attribut StoreEntitySet dans chaque élément MappingFragment enfant ou dans l’élément EntitySetMapping lui-même.

L’élément EntitySetMapping peut avoir les éléments enfants suivants :

  • EntityTypeMapping (zéro ou plus)
  • QueryView (zéro ou un élément)
  • MappingFragment (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément EntitySetMapping .

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom du jeu d'entités de modèle conceptuel mappé.
TypeName1 Non Nom du type d'entité de modèle conceptuel mappé.
StoreEntitySet1 Non Nom du jeu d'entités de modèle de stockage de destination du mappage.
MakeColumnsDistinct Non True ou False selon que seules les lignes distinctes sont retournées.
Si cet attribut est défini sur True, l’attribut GenerateUpdateViews de l’élément EntityContainerMapping doit être défini sur False.

 

1 Les attributs typeName et StoreEntitySet peuvent être utilisés à la place des éléments enfants EntityTypeMapping et MappingFragment pour mapper un type d’entité unique à une seule table.

Exemple

L’exemple suivant montre un élément EntitySetMapping qui mappe trois types (un type de base et deux types dérivés) dans l’ensemble d’entités Courses ensemble d’entités du modèle conceptuel à trois tables différentes de la base de données sous-jacente. Les tables sont spécifiées par l’attribut StoreEntitySet dans chaque élément MappingFragment .

 <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, élément (MSL)

L’élément EntityTypeMapping dans le langage de spécification de mappage (MSL) définit le mappage entre un type d’entité dans le modèle conceptuel et les tables ou vues dans la base de données sous-jacente. Pour plus d'informations sur les types d'entité de modèle conceptuel et les tables ou les vues de base de données sous-jacente, consultez Élément EntityType (CSDL) et Élément EntitySet (SSDL). Le type d’entité de modèle conceptuel mappé est spécifié par l’attribut TypeName de l’élément EntityTypeMapping. La table ou la vue qui est mappée est spécifiée par l’attribut StoreEntitySet de l’élément MappingFragment enfant.

L'élément enfant ModificationFunctionMapping peut être utilisé pour mapper les fonctions d'insertion, de mise à jour ou de suppression de types d'entités aux procédures stockées de la base de données.

L’élément EntityTypeMapping peut avoir les éléments enfants suivants :

  • MappingFragment (zéro ou plus)
  • ModificationFunctionMapping (zéro ou un élément)
  • ScalarProperty
  • Condition

Remarque

Les élémentsMappingFragment et ModificationFunctionMapping ne peuvent pas être des éléments enfants de l’élément EntityTypeMapping en même temps.

Remarque

Les éléments ScalarProperty et Condition ne peuvent être que des éléments enfants de l’élément EntityTypeMapping lorsqu’il est utilisé dans un élément FunctionImportMapping.

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément EntityTypeMapping.

Nom de l’attribut Est obligatoire Valeur
TypeName Oui Nom qualifié par un espace de noms du type d'entité de modèle conceptuel mappé.
Si le type correspond à un type abstrait ou dérivé, la valeur doit être IsOfType(Namespace-qualified_type_name).

Exemple

L’exemple suivant montre un élément EntitySetMapping avec deux éléments EntityTypeMapping enfants. Dans le premier élément EntityTypeMapping, le type d’entité SchoolModel.Person est mappé à la table Person. Dans le deuxième élément EntityTypeMapping, la fonctionnalité de mise à jour du type SchoolModel.Person est mappée à une procédure stockée, UpdatePerson, dans la base de données.

 <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>

Exemple

L'exemple suivant illustre le mappage d'une hiérarchie de types dont le type racine est abstrait. Notez l’utilisation de la syntaxe IsOfType pour les attributs TypeName.

 <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, élément (MSL)

L’élément FunctionImportMapping dans le langage de spécification de mappage (MSL) définit le mappage entre une importation de fonction dans le modèle conceptuel et une procédure stockée ou une fonction dans la base de données sous-jacente. Les importations de fonction doivent être déclarées dans le modèle conceptuel et les procédures stockées dans le modèle de stockage. Pour plus d’informations, consultez l’élément FunctionImport (CSDL) et l’élément Function (SSDL).

Remarque

Par défaut, si une importation de fonction retourne un type d'entité ou un type complexe de modèle conceptuel, les noms des colonnes retournés par la procédure stockée sous-jacente doivent correspondre exactement aux noms des propriétés sur le type de modèle conceptuel. Si les noms de colonnes ne correspondent pas exactement aux noms de propriétés, le mappage doit être défini dans un élément ResultMapping.

L’élément FunctionImportMapping peut avoir les éléments enfants suivants :

  • ResultMapping (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément FunctionImportMapping :

Nom de l’attribut Est obligatoire Valeur
FunctionImportName Oui Nom de l'importation de fonction dans le modèle conceptuel mappé.
FunctionName Oui Nom qualifié par un espace de noms de la fonction dans le modèle de stockage mappé.

Exemple

L'exemple suivant est basé sur le modèle School. Considérez la fonction suivante dans le modèle de stockage :

 <Function Name="GetStudentGrades" Aggregate="false"
           BuiltIn="false" NiladicFunction="false"
           IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion"
           Schema="dbo">
   <Parameter Name="StudentID" Type="int" Mode="In" />
 </Function>

Considérez également cette importation de fonction dans le modèle conceptuel :

 <FunctionImport Name="GetStudentGrades" EntitySet="StudentGrades"
                 ReturnType="Collection(SchoolModel.StudentGrade)">
   <Parameter Name="StudentID" Mode="In" Type="Int32" />
 </FunctionImport>

L’exemple suivant montre un élément FunctionImportMapping utilisé pour mapper la fonction et l’importation de fonction ci-dessus :

 <FunctionImportMapping FunctionImportName="GetStudentGrades"
                        FunctionName="SchoolModel.Store.GetStudentGrades" />

 

InsertFunction, élément (MSL)

L’élément InsertFunction dans le langage de spécification de mappage (MSL) mappe la fonction d’insertion d’un type d’entité ou d’une association dans le modèle conceptuel à une procédure stockée dans la base de données sous-jacente. Les procédures stockées auxquelles des fonctions de modification sont mappées doivent être déclarées dans le modèle de stockage. Pour plus d’informations, consultez Function (élément) (SSDL).

Remarque

Si vous ne mappez pas les trois opérations d’insertion, de mise à jour ou de suppression d’un type d’entité aux procédures stockées, les opérations non mappées échouent si elles sont exécutées au moment de l’exécution et qu’une exception UpdateException est levée.

L’élément InsertFunction peut être un enfant de l’élément ModificationFunctionMapping et appliqué à l’élément EntityTypeMapping ou à l’élément AssociationSetMapping.

Application d'InsertFunction à EntityTypeMapping

Lorsqu’il est appliqué à l’élément EntityTypeMapping, l’élément InsertFunction mappe la fonction d’insertion d’un type d’entité dans le modèle conceptuel à une procédure stockée.

L’élément InsertFunction peut avoir les éléments enfants suivants lorsqu’il est appliqué à un élément EntityTypeMapping :

  • AssociationEnd (zéro, un ou plusieurs éléments)
  • ComplexProperty (zéro, un ou plusieurs éléments)
  • ResultBinding (zéro ou un élément)
  • ScalarProperty (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément InsertFunction lorsqu’il est appliqué à un élément EntityTypeMapping .

Nom de l’attribut Est obligatoire Valeur
FunctionName Oui Nom qualifié par un espace de noms de la procédure stockée à laquelle la fonction d'insertion est mappée. La procédure stockée doit être déclarée dans le modèle de stockage.
RowsAffectedParameter Non Nom du paramètre de sortie qui retourne le nombre de lignes affectées.

Exemple

L’exemple suivant est basé sur le modèle School et montre l’élément InsertFunction utilisé pour mapper la fonction d’insertion du type d’entité Person à la procédure stockée InsertPerson. La procédure stockée InsertPerson est déclarée dans le modèle de stockage.

 <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>

Application d'InsertFunction à AssociationSetMapping

Lorsqu’il est appliqué à l’élément AssociationSetMapping, l’élément InsertFunction mappe la fonction d’insertion d’une association dans le modèle conceptuel à une procédure stockée.

L’élément InsertFunction peut avoir les éléments enfants suivants lorsqu’il est appliqué à l’élément AssociationSetMapping :

  • EndProperty

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément InsertFunction lorsqu’il est appliqué à l’élément AssociationSetMapping.

Nom de l’attribut Est obligatoire Valeur
FunctionName Oui Nom qualifié par un espace de noms de la procédure stockée à laquelle la fonction d'insertion est mappée. La procédure stockée doit être déclarée dans le modèle de stockage.
RowsAffectedParameter Non Nom du paramètre de sortie qui retourne le nombre de lignes affectées.

Exemple

L’exemple suivant est basé sur le modèle School et montre l’élément InsertFunction utilisé pour mapper la fonction d’insertion de l’association CourseInstructor à la procédure stockée InsertCourseInstructor. La procédure stockée InsertCourseInstructor est déclarée dans le modèle de stockage.

 <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>

Élément de mappage (MSL)

L’élément Mappage dans le langage MSL (Mapping Specification Language) contient des informations pour les objets de mappage définis dans un modèle conceptuel vers une base de données (comme décrit dans un modèle de stockage). Pour plus d’informations, consultez Spécification CSDL et Spécification SSDL.

L’élément Mappage est l’élément racine d’une spécification de mappage. L’espace de noms XML pour les spécifications de mappage est https://schemas.microsoft.com/ado/2009/11/mapping/cs.

L'élément de mappage peut avoir les éléments enfants suivants (dans l'ordre répertorié) :

  • Alias (zéro ou plus)
  • EntityContainerMapping (exactement un)

Les noms de types de modèle conceptuel et de stockage référencés en MSL doivent être qualifiés par le nom de leur espace de noms respectif. Pour plus d’informations sur le nom de l’espace de noms du modèle conceptuel, consultez Schema Element (CSDL). Pour plus d’informations sur le nom de l’espace de noms du modèle de stockage, consultez l’élément de schéma (SSDL). Les alias d'espace de noms utilisés en MSL peuvent être définis avec l'élément Alias.

Attributs applicables

Le tableau ci-dessous décrit les attributs qui peuvent être appliqués à l’élément Mapping.

Nom de l’attribut Est obligatoire Valeur
Space Oui C-S. Il s'agit d'une valeur fixe qui ne peut pas être modifiée.

Exemple

L’exemple suivant montre un élément Mapping basé sur une partie du modèle School. Pour plus d’informations sur le modèle School, consultez Démarrage rapide (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, élément (MSL)

L’élément MappingFragment dans le langage de spécification de mappage (MSL) définit le mappage entre les propriétés d’un type d’entité de modèle conceptuel et une table ou vue dans la base de données. Pour plus d'informations sur les types d'entité de modèle conceptuel et les tables ou les vues de base de données sous-jacente, consultez Élément EntityType (CSDL) et Élément EntitySet (SSDL). Le MappingFragment peut être un élément enfant de l’élément EntityTypeMapping ou de l’élément EntitySetMapping.

L’élément MappingFragment peut avoir les éléments enfants suivants :

  • ComplexType (zéro ou plus)
  • ScalarProperty (zéro ou plus)
  • Condition (zéro, un ou plusieurs éléments)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément MappingFragment .

Nom de l’attribut Est obligatoire Valeur
StoreEntitySet Oui Nom de la table ou de la vue mappée.
MakeColumnsDistinct Non True ou False selon que seules les lignes distinctes sont retournées.
Si cet attribut est défini sur True, l’attribut GenerateUpdateViews de l’élément EntityContainerMapping doit être défini sur False.

Exemple

L’exemple suivant montre un élément MappingFragment en tant qu’enfant d’un élément EntityTypeMapping . Dans cet exemple, les propriétés du type Course dans le modèle conceptuel sont mappées aux colonnes de la table Course de la base de données.

 <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>

Exemple

L’exemple suivant montre un élément MappingFragment en tant qu’enfant d’un élément EntitySetMapping . Comme dans l’exemple ci-dessus, les propriétés du type Course dans le modèle conceptuel sont mappées aux colonnes de la table Course dans la base de données.

 <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, élément (MSL)

Le ModificationFunctionMapping élément dans le langage de spécification de mappage (MSL) mappe les fonctions d’insertion, de mise à jour et de suppression d’un type d’entité de modèle conceptuel aux procédures stockées dans la base de données sous-jacente. L’élément ModificationFunctionMapping peut également mapper les fonctions d’insertion et de suppression pour les associations plusieurs-à-plusieurs dans le modèle conceptuel aux procédures stockées dans la base de données sous-jacente. Les procédures stockées auxquelles des fonctions de modification sont mappées doivent être déclarées dans le modèle de stockage. Pour plus d’informations, consultez Function (élément) (SSDL).

Remarque

Si vous ne mappez pas les trois opérations d’insertion, de mise à jour ou de suppression d’un type d’entité aux procédures stockées, les opérations non mappées échouent si elles sont exécutées au moment de l’exécution et qu’une exception UpdateException est levée.

Remarque

Si les fonctions de modification pour une entité dans une hiérarchie d'héritage sont mappées aux procédures stockées, les fonctions de modification de tous les types dans la hiérarchie doivent être mappées aux procédures stockées.

L’élément ModificationFunctionMapping peut être un enfant de l’élément EntityTypeMapping ou de l’élément AssociationSetMapping.

L’élément ModificationFunctionMapping peut avoir les éléments enfants suivants :

  • DeleteFunction (zéro ou un élément)
  • InsertFunction (zéro ou un)
  • UpdateFunction (zéro ou un)

Aucun attribut n’est applicable à l’élément ModificationFunctionMapping.

Exemple

L’exemple suivant montre le mappage des ensembles d’entités pour l’ensemble d’entités People dans le modèle School. En plus du mappage de colonnes pour le type d’entité Person, le mappage des fonctions d’insertion, de mise à jour et de suppression du type Person s’affiche. Les fonctions mappées sont déclarées dans le modèle de stockage.

 <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>

Exemple

L’exemple suivant montre le mappage des ensembles d’associations pour le jeu d’associations CourseInstructor défini dans le modèle School. Outre le mappage de colonnes pour l’association CourseInstructor, le mappage des fonctions d’insertion et de suppression de l’association CourseInstructor s’affiche. Les fonctions mappées sont déclarées dans le modèle de stockage.

 <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, élément (MSL)

L’élémentQueryView dans le langage de spécification de mappage (MSL) définit un mappage en lecture seule entre un type d’entité ou une association dans le modèle conceptuel et une table dans la base de données sous-jacente. Le mappage est défini avec une requête Entity SQL évaluée par rapport au modèle de stockage, et vous exprimez le jeu de résultats en termes d’entité ou d’association dans le modèle conceptuel. Les affichages des requêtes étant en lecture seule, les types qu'ils définissent ne peuvent pas être mis à jour au moyen des commandes de mise à jour standard. Les mises à jour de ces types peuvent être effectuées au moyen de fonctions de modification. Pour plus d’informations, consultez Guide pratique pour mapper les fonctions de modification aux procédures stockées.

Remarque

Dans l’élément QueryView , les expressions Entity SQL qui contiennent GroupBy, les agrégats de groupe ou les propriétés de navigation ne sont pas prises en charge.

 

L’élément QueryView peut être un enfant de l’élément EntitySetMapping ou de l’élément AssociationSetMapping. Dans le cas précédent, l'affichage des requêtes définit un mappage en lecture seule pour une entité dans le modèle conceptuel. Dans le cas précédent, l'affichage des requêtes définit un mappage en lecture seule pour une association dans le modèle conceptuel.

Remarque

Si l’élément AssociationSetMapping concerne une association avec une contrainte référentielle, l’élément AssociationSetMapping est ignoré. Pour plus d’informations, consultez l’élément ReferentialConstraint (CSDL).

L’élément QueryView ne peut pas avoir d’éléments enfants.

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément QueryView.

Nom de l’attribut Est obligatoire Valeur
TypeName Non Nom du type de modèle conceptuel mappé par l'affichage des requêtes.

Exemple

L’exemple suivant montre l’élément QueryView en tant qu’enfant de l’élément EntitySetMapping et définit un mappage d’affichage de requête pour le type d’entité Department dans le modèle scolaire.

 <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>

Étant donné que la requête retourne uniquement un sous-ensemble des membres du type Department dans le modèle de stockage, le type Department du modèle School a été modifié en fonction de ce mappage comme suit :

 <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>

Exemple

L’exemple suivant montre l’élément QueryView en tant qu’enfant d’un élément AssociationSetMapping et définit un mappage en lecture seule pour l’association FK_Course_Department dans le modèle School.

 <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>

 

Commentaires

Vous pouvez définir des affichages des requêtes pour activer les scénarios suivants :

  • Définir une entité du modèle conceptuel qui n'inclut pas toutes les propriétés de l'entité dans le modèle de stockage. Cela inclut les propriétés qui n’ont pas de valeurs par défaut et ne prennent pas en charge valeurs null.
  • Mapper des colonnes calculées du modèle de stockage aux propriétés de types d'entités du modèle conceptuel.
  • Définir un mappage dans lequel les conditions utilisées pour partitionner des entités du modèle conceptuel ne sont pas basées sur l'égalité. Lorsque vous spécifiez un mappage conditionnel à l’aide de l’élément Condition, la condition fournie doit être égale à la valeur spécifiée. Pour plus d’informations, consultez Condition, élément (MSL).
  • Mapper la même colonne du modèle de stockage à plusieurs types du modèle conceptuel.
  • Mapper plusieurs types à la même table.
  • Définir des associations dans le modèle conceptuel qui ne sont pas basées sur des clés étrangères du schéma relationnel.
  • Utiliser une logique métier personnalisée pour définir la valeur de propriétés du modèle conceptuel. Par exemple, vous pouvez mapper la valeur de chaîne « T » dans la source de données à une valeur de true, booléen, dans le modèle conceptuel.
  • Définir des filtres conditionnels pour les résultats de la requête.
  • Appliquer moins de restrictions sur les données dans le modèle conceptuel que dans le modèle de stockage. Par exemple, vous pouvez créer une propriété dans le modèle conceptuel nullable même si la colonne à laquelle elle est mappée ne prend pas en charge valeurs de null.

Vous devez tenir compte des points suivants lorsque vous définissez des affichages des requêtes pour les entités :

  • Les affichages des requêtes sont en lecture seule. Les mises à jour des entités ne peuvent être effectuées qu'au moyen de fonctions de modification.
  • Lorsque vous définissez un type d'entité par un affichage des requêtes, vous devez également définir toutes les entités associées par les affichages des requêtes.
  • Lorsque vous mappez une association plusieurs-à-plusieurs à une entité dans le modèle de stockage qui représente une table de liens dans le schéma relationnel, vous devez définir un élément QueryView dans l’élément AssociationSetMapping pour cette table de liens.
  • Les affichages des requêtes doivent être définis pour tous les types d'une hiérarchie des types. Pour ce faire, vous pouvez procéder de différentes façons :
    • Avec un seul QueryView élément qui spécifie une requête Entity SQL unique qui retourne une union de tous les types d’entités dans la hiérarchie.
    • Avec un seul élément QueryView qui spécifie une requête Entity SQL unique qui utilise l’opérateur CASE pour retourner un type d’entité spécifique dans la hiérarchie en fonction d’une condition spécifique.
    • Avec un élément QueryView supplémentaire pour un type spécifique dans la hiérarchie. Dans ce cas, utilisez l’attribut TypeName de l’élément QueryView pour spécifier le type d’entité pour chaque vue.
  • Lorsqu’une vue de requête est définie, vous ne pouvez pas spécifier l’attribut StorageSetName sur l’élément EntitySetMapping .
  • Lorsqu’une vue de requête est définie, l’élément EntitySetMappingne peut pas également contenir de mappages Property.

Élément ResultBinding (MSL)

L’élément ResultBinding dans le langage de spécification de mappage (MSL) mappe les valeurs de colonne retournées par des procédures stockées aux propriétés d’entité dans le modèle conceptuel lorsque les fonctions de modification de type d’entité sont mappées aux procédures stockées dans la base de données sous-jacente. Par exemple, lorsque la valeur d’une colonne d’identité est retournée par une procédure stockée d’insertion, l’élément ResultBinding mappe la valeur retournée à une propriété de type d’entité dans le modèle conceptuel.

L’élément ResultBinding peut être enfant de l’élément InsertFunction ou de l’élément UpdateFunction.

L’élément ResultBinding ne peut pas avoir d’éléments enfants.

Attributs applicables

Le tableau suivant décrit les attributs applicables à l’élément ResultBinding :

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom de la propriété d'entité dans le modèle conceptuel mappé.
ColumnName Oui Nom de la colonne mappée.

Exemple

L’exemple suivant est basé sur le modèle School et montre un élément InsertFunction utilisé pour mapper la fonction d’insertion du type d’entité Person à la procédure stockée InsertPerson. (La procédure stockée InsertPerson est indiquée ci-dessous et est déclarée dans le modèle de stockage.) Un élément ResultBinding est utilisé pour mapper une valeur de colonne retournée par la procédure stockée (NewPersonID) à une propriété de type d’entité (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>

Le code Transact-SQL suivant décrit la procédure stockée 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;

Élément ResultMapping (MSL)

L’élément ResultMapping dans le langage de spécification de mappage (MSL) définit le mappage entre une importation de fonction dans le modèle conceptuel et une procédure stockée dans la base de données sous-jacente lorsque les valeurs suivantes sont vraies :

  • L'importation de fonction retourne un type d'entité de modèle conceptuel ou le type complexe.
  • Les noms des colonnes retournés par la procédure stockée ne correspondent pas exactement aux noms des propriétés sur le type d'entité ou le type complexe.

Par défaut, le mappage entre les colonnes retournées par une procédure stockée et un type d'entité ou un type complexe est basé sur les noms de colonne et de propriété. Si les noms de colonnes ne correspondent pas exactement aux noms de propriétés, vous devez utiliser l’élément ResultMapping pour définir le mappage. Pour obtenir un exemple de mappage par défaut, consultez FunctionImportMapping, élément (MSL).

L’élément ResultMapping est un élément enfant de l’élément FunctionImportMapping.

L’élément ResultMapping peut avoir les éléments enfants suivants :

  • EntityTypeMapping (zéro ou plus)
  • ComplexTypeMapping

Aucun attribut n’est applicable à l’élément ResultMapping.

Exemple

Examinez la procédure stockée suivante :

 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

De même, considérons le type d'entité de modèle conceptuel suivant :

 <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>

Pour créer une importation de fonction qui retourne des instances du type d’entité précédent, le mappage entre les colonnes retournées par la procédure stockée et le type d’entité doit être défini dans un élément 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, élément (MSL)

L’élément ScalarProperty dans le langage de spécification de mappage (MSL) mappe une propriété sur un type d’entité de modèle conceptuel, un type complexe ou une association à une colonne de table ou un paramètre de procédure stockée dans la base de données sous-jacente.

Remarque

Les procédures stockées auxquelles des fonctions de modification sont mappées doivent être déclarées dans le modèle de stockage. Pour plus d’informations, consultez Function (élément) (SSDL).

L’élément ScalarProperty peut être un enfant des éléments suivants :

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

En tant qu’enfant de l’élément MappingFragment, ComplexProperty, ou EndProperty, l’élément ScalarProperty mappe une propriété dans le modèle conceptuel à une colonne de la base de données. En tant qu’enfant de l'élément InsertFunction, UpdateFunctionou DeleteFunction, l’élément ScalarProperty mappe une propriété dans le modèle conceptuel à un paramètre de procédure stockée.

L’élément ScalarProperty ne peut pas avoir d’éléments enfants.

Attributs applicables

Les attributs qui s’appliquent à l’élément ScalarProperty diffèrent selon le rôle de l’élément.

Le tableau suivant décrit les attributs applicables lorsque l’élément ScalarProperty est utilisé pour mapper une propriété de modèle conceptuel à une colonne de la base de données :

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom de la propriété de modèle conceptuel mappée.
ColumnName Oui Nom de la colonne de table mappée.

Le tableau suivant décrit les attributs applicables à l’élément ScalarProperty lorsqu’il est utilisé pour mapper une propriété de modèle conceptuel à un paramètre de procédure stockée :

Nom de l’attribut Est obligatoire Valeur
Nom Oui Nom de la propriété de modèle conceptuel mappée.
ParameterName Oui Nom du paramètre mappé.
Version Non Current ou Original selon si la valeur actuelle ou la valeur d’origine de la propriété doit être utilisée pour les vérifications d’accès concurrentiel.

Exemple

L’exemple suivant montre l’élément ScalarProperty utilisé de deux manières :

  • Pour mapper les propriétés du type d’entité Person aux colonnes de la table Person.
  • Pour mapper les propriétés du type d’entité Person aux paramètres de la procédure stockée UpdatePerson . Les procédures stockées sont déclarées dans le modèle de stockage.
 <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>

Exemple

L’exemple suivant montre l’élément ScalarProperty utilisé pour mapper les fonctions d’insertion et de suppression d’une association de modèle conceptuel aux procédures stockées dans la base de données. Les procédures stockées sont déclarées dans le modèle de stockage.

 <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, élément (MSL)

L’élément UpdateFunction dans le langage de spécification de mappage (MSL) mappe la fonction de mise à jour d’un type d’entité dans le modèle conceptuel à une procédure stockée dans la base de données sous-jacente. Les procédures stockées auxquelles des fonctions de modification sont mappées doivent être déclarées dans le modèle de stockage. Pour plus d’informations, consultez Function (élément) (SSDL).

Remarque

Si vous ne mappez pas les trois opérations d’insertion, de mise à jour ou de suppression d’un type d’entité aux procédures stockées, les opérations non mappées échouent si elles sont exécutées au moment de l’exécution et qu’une exception UpdateException est levée.

L’élément UpdateFunction peut être un enfant de l’élément ModificationFunctionMapping et appliqué à l’élément EntityTypeMapping.

L’élément UpdateFunction peut avoir les éléments enfants suivants :

  • AssociationEnd (zéro, un ou plusieurs éléments)
  • ComplexProperty (zéro, un ou plusieurs éléments)
  • ResultBinding (zéro ou un élément)
  • ScalarProperty (zéro ou plus)

Attributs applicables

Le tableau suivant décrit les attributs qui peuvent être appliqués à l’élément UpdateFunction.

Nom de l’attribut Est obligatoire Valeur
FunctionName Oui Nom qualifié par un espace de noms de la procédure stockée à laquelle la fonction de mise à jour est mappée. La procédure stockée doit être déclarée dans le modèle de stockage.
RowsAffectedParameter Non Nom du paramètre de sortie qui retourne le nombre de lignes affectées.

Exemple

L’exemple suivant est basé sur le modèle School et montre l’élément UpdateFunction utilisé pour mapper la fonction de mise à jour du type d’entité Person à la procédure stockée UpdatePerson. La procédure stockée UpdatePerson est déclarée dans le modèle de stockage.

 <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>