Especificación MSL

El lenguaje de especificación de asignaciones (MSL) es un lenguaje basado en XML que describe la asignación entre el modelo conceptual y el modelo de almacenamiento de una aplicación de Entity Framework.

En una aplicación de Entity Framework, los metadatos de asignación se cargan desde un archivo .msl (escrito en MSL) en tiempo de compilación. Entity Framework usa los metadatos de asignación en tiempo de ejecución para convertir las consultas realizadas contra el modelo conceptual en comandos específicos del almacenamiento.

Entity Framework Designer (EF Designer) almacena la información de asignación en un archivo .edmx en tiempo de diseño. Entity Designer usa la información de un archivo .edmx en tiempo de compilación para crear el archivo .msl que Entity Framework necesita en tiempo de ejecución.

Los nombres de todos los tipos de modelos conceptuales o de almacenamiento a los que se hace referencia en MSL deben estar calificados con sus respectivos nombres de espacios de nombres. Para obtener información sobre el nombre del espacio de nombres del modelo conceptual, consulte Especificación CSDL. Para más información sobre el nombre del espacio de nombres del modelo de almacenamiento, consulte Especificación SSDL.

Las versiones de MSL se diferencian por los espacios de nombres XML.

Versión de MSL Espacio de nombres 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 (Elemento) (MSL)

El elemento Alias del lenguaje de especificación de asignaciones (MSL) es un elemento secundario del elemento Mapping que se utiliza para definir los alias de los espacios de nombres del modelo conceptual y del modelo de almacenamiento. Los nombres de todos los tipos de modelos conceptuales o de almacenamiento a los que se hace referencia en MSL deben estar calificados con sus respectivos nombres de espacios de nombres. Para más información sobre el nombre del espacio de nombres del modelo conceptual, consulte Schema (Elemento) (CSDL). Para más información sobre el nombre del espacio de nombres del modelo de almacenamiento, consulte Schema (Elemento) (SSDL).

El elemento Alias no puede tener elementos secundarios.

Atributos aplicables

En la tabla siguiente se describen los atributos que se pueden aplicar al elemento Alias.

Nombre del atributo Es obligatorio Valor
Clave El alias del espacio de nombres que se especifica con el atributo Value.
Valor El espacio de nombres para el que el valor del elemento Key es un alias.

Ejemplo

En el siguiente ejemplo se muestra un elemento Alias que define un alias, c, para los tipos que se definen en el modelo conceptual.

 <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 (Elemento) (MSL)

El elemento AssociationEnd del lenguaje de especificación de asignaciones (MSL) se utiliza cuando las funciones de modificación de un tipo de entidad en el modelo conceptual están asignadas a procedimientos almacenados en la base de datos subyacente. Si un procedimiento almacenado de modificación toma un parámetro cuyo valor está contenido en una propiedad de asociación, el elemento AssociationEnd asigna el valor de propiedad al parámetro. Para obtener más información, vea el ejemplo siguiente.

Para más información sobre las funciones de modificación de asignaciones de tipos de entidad a procedimientos almacenados, consulte Elemento ModificationFunctionMapping (MSL) y Tutorial: Asignación de una entidad a procedimientos almacenados.

El elemento AssociationEnd puede tener los elementos secundarios siguientes:

  • ScalarProperty

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento AssociationEnd.

Nombre del atributo Es obligatorio Valor
AssociationSet El nombre de la asociación que se está asignando.
Desde El valor del atributo FromRole de la propiedad de navegación que corresponde a la asociación que se está asignando. Para más información, consulte Elemento NavigationProperty (CSDL).
Hasta El valor del atributo ToRole de la propiedad de navegación que corresponde a la asociación que se está asignando. Para más información, consulte Elemento NavigationProperty (CSDL).

Ejemplo

Considere el siguiente tipo de entidad del modelo conceptual:

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

Considere también el siguiente procedimiento almacenado:

 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;

Para asignar la función de actualización de la entidad Course a este procedimiento almacenado, debe proporcionar un valor al parámetro DepartmentID. El valor para DepartmentID no corresponde a una propiedad del tipo de entidad; está contenido en una asociación independiente cuya asignación se muestra aquí:

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

El siguiente código muestra el elemento AssociationEnd que se utiliza para asignar la propiedad DepartmentID de la asociación FK_Course_Department al procedimiento almacenado UpdateCourse (al que la función de actualización del tipo de entidad Course está asignada):

 <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 (Elemento) (MSL)

El elemento AssociationSetMapping del lenguaje de especificación de asignaciones (MSL) define la asignación entre una asociación del modelo conceptual y columnas de tabla de la base de datos subyacente.

Las asociaciones del modelo conceptual son tipos cuyas propiedades representan columnas de clave primaria y clave externa de la base de datos subyacente. El elemento AssociationSetMapping utiliza dos elementos EndProperty para definir las asignaciones entre las propiedades de tipo de asociación y las columnas de la base de datos. Puede definir condiciones en estas asignaciones con el elemento Condition. Asigne las funciones de inserción, actualización y eliminación para las asociaciones a procedimientos almacenados de la base de datos mediante el elemento ModificationFunctionMapping. Defina las asignaciones de solo lectura entre las asociaciones y columnas de tabla mediante una cadena de Entity SQL en un elemento QueryView.

Nota:

Si se define una restricción referencial para una asociación del modelo conceptual, la asociación no necesita estar asignada con un elemento AssociationSetMapping. Si un elemento AssociationSetMapping está presente para una asociación que tiene una restricción referencial, se omitirán las asignaciones definidas en el elemento AssociationSetMapping. Para más información, consulte Elemento ReferentialConstraint (CSDL).

El elemento AssociationSetMapping puede tener los elementos secundarios siguientes

  • QueryView (cero o uno)
  • EndProperty (cero o dos)
  • Condition (cero o más)
  • ModificationFunctionMapping (cero o uno)

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento AssociationSetMapping.

Nombre del atributo Es obligatorio Valor
Nombre El nombre del conjunto de asociaciones del modelo conceptual que se está asignando.
TypeName No El nombre completo, calificado con el espacio de nombres, del tipo de asociación del modelo conceptual que se está asignando.
StoreEntitySet No El nombre de la tabla que se está asignando.

Ejemplo

En el siguiente ejemplo se muestra un elemento AssociationSetMapping en el que la asociación FK_Course_Department establecida en el modelo conceptual se asigna a la tabla Course de la base de datos. Las asignaciones entre propiedades de tipo de asociación y columnas de tabla se especifican en elementos EndProperty secundarios.

 <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 (Elemento) (MSL)

Un elemento ComplexProperty del lenguaje de especificación de asignaciones (MSL) define la asignación entre una propiedad de tipo complejo en un tipo de entidad del modelo conceptual y las columnas de la tabla de la base de datos subyacente. Las asignaciones entre columnas y propiedades se especifican en elementos secundarios ScalarProperty.

El elemento de propiedad ComplexType puede tener los elementos secundarios siguientes:

  • ScalarProperty (cero o más)
  • ComplexProperty (cero o más)
  • ComplexTypeMapping (cero o más)
  • Condition (cero o más)

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento ComplexProperty:

Nombre del atributo Es obligatorio Valor
Nombre El nombre de la propiedad compleja de un tipo de entidad del modelo conceptual que se está asignando.
TypeName No El nombre completo, calificado con el espacio de nombres, del tipo de propiedad del modelo conceptual.

Ejemplo

El siguiente ejemplo se basa en el modelo School. El siguiente tipo complejo se ha agregado al modelo conceptual:

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

Las propiedades LastName y FirstName del tipo de entidad Person se han reemplazado por una propiedad compleja, 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>

El siguiente MSL muestra el elemento ComplexProperty utilizado para asignar la propiedad Name a las columnas de la base de datos subyacente:

 <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 (Elemento) (MSL)

El elemento ComplexTypeMapping del lenguaje de especificación de asignaciones (MSL) es un elemento secundario del elemento ResultMapping y define la asignación entre una importación de función en el modelo conceptual y un procedimiento almacenado en la base de datos subyacente cuando se cumplen las siguientes condiciones:

  • La importación de función devuelve un tipo complejo conceptual.
  • Los nombres de las columnas devueltas por el procedimiento almacenado no coinciden exactamente con los nombres de las propiedades en el tipo complejo.

De forma predeterminada, la asignación entre las columnas devueltas por un procedimiento almacenado y un tipo complejo se basa en los nombres de las propiedades y de las columnas. Si los nombres de las columnas no coinciden exactamente con los nombres de las propiedades, debe utilizar el elemento ComplexTypeMapping para definir la asignación. Para obtener un ejemplo de la asignación predeterminada, consulte Elemento FunctionImportMapping (MSL).

El elemento ComplexTypeMapping puede tener los elementos secundarios siguientes:

  • ScalarProperty (cero o más)

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento ComplexTypeMapping.

Nombre del atributo Es obligatorio Valor
TypeName El nombre completo, incluido el espacio de nombres, del tipo complejo que se está asignando.

Ejemplo

Observe el siguiente procedimiento almacenado:

 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

Considere también el siguiente tipo complejo del modelo conceptual:

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

Para crear una importación de función que devuelva instancias del tipo complejo anterior, la asignación entre las columnas devueltas por el procedimiento almacenado y el tipo de entidad se debe definir en un elemento 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 (Elemento) (MSL)

El elemento Condition del lenguaje de especificación de asignaciones (MSL) establece condiciones en las asignaciones entre el modelo conceptual y la base de datos subyacente. La asignación que se define dentro de un nodo XML es válida si se cumplen todas las condiciones especificadas en elementos Condition secundarios. De lo contrario, la asignación no es válida. Por ejemplo, si un elemento MappingFragment contiene uno o más elementos Condition secundarios, la asignación definida dentro del nodo MappingFragment solo será válida si se cumplen todas las condiciones de los elementos Condition secundarios.

Cada condición se puede aplicar a un Name (el nombre de una propiedad de entidad del modelo conceptual, especificada mediante el atributo Name), o a un ColumnName (el nombre de una columna de la base de datos, especificada mediante el atributo ColumnName). Cuando se establece el atributo Name, la condición se comprueba en comparación con un valor de propiedad de la entidad. Cuando se establece el atributo ColumnName, la condición se comprueba en comparación con un valor de columna. Solo se puede especificar un atributo Name o ColumnName en un elemento Condition.

Nota:

Cuando el elemento Condition se utiliza dentro de un elemento FunctionImportMapping, solo el atributo Name no es aplicable.

El elemento Condition puede ser un secundario de los elementos siguientes:

  • AssociationSetMapping
  • ComplexProperty
  • EntitySetMapping
  • MappingFragment
  • EntityTypeMapping

El elemento Condition puede no tener elementos secundarios.

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento Condition:

Nombre del atributo Es obligatorio Valor
ColumnName No El nombre de la columna de la tabla cuyo valor se utiliza para evaluar la condición.
IsNull No True o False. Si el valor es True y el valor de la columna es null, o si el valor es False y el valor de la columna no es null, la condición es verdadera. De lo contrario, la condición es falsa.
Los atributos IsNull y Value no se pueden utilizar al mismo tiempo.
Valor No El valor con el que se compara el valor de la columna. Si los valores son los mismos, la condición es verdadera. De lo contrario, la condición es falsa.
Los atributos IsNull y Value no se pueden utilizar al mismo tiempo.
Nombre No El nombre de la propiedad de entidad del modelo conceptual cuyo valor se utiliza para evaluar la condición.
Este atributo no es aplicable si el elemento Condition se utiliza dentro de un elemento FunctionImportMapping.

Ejemplo

En el ejemplo siguiente se muestran elementos Condition como elementos secundarios de MappingFragment. Si HireDate no es null y EnrollmentDate es null, los datos se asignan entre el tipo SchoolModel.Instructor y las columnas PersonID y HireDate de la tabla Person. Si EnrollmentDate no es null y HireDate es null, los datos se asignan entre el tipo SchoolModel.Student y las columnas PersonID y Enrollment de la tabla 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 (Elemento) (MSL)

El elemento DeleteFunction del lenguaje de especificación de asignaciones (MSL) asigna la función de eliminación de un tipo de entidad o asociación del modelo conceptual a un procedimiento almacenado de la base de datos subyacente. Los procedimientos almacenados a los que están asignados las funciones de modificación se deben declarar en el modelo de almacenamiento. Para obtener más información, vea Elementos de función (SSDL).

Nota:

Si no asigna las tres operaciones de inserción, actualización o eliminación de un tipo de entidad a procedimientos almacenados, se producirá un error en las operaciones no asignadas al ejecutarlas y se producirá una excepción UpdateException.

DeleteFunction aplicado a EntityTypeMapping

Cuando se aplica al elemento EntityTypeMapping, el elemento DeleteFunction asigna la función de eliminación de un tipo de entidad del modelo conceptual a un procedimiento almacenado.

El elemento DeleteFunction puede tener los elementos secundarios siguientes cuando se aplica a un elemento EntityTypeMapping:

  • AssociationEnd (cero o más)
  • ComplexProperty (cero o más)
  • ScalarProperty (cero o más)

Atributos aplicables

En la tabla siguiente se describen los atributos que se pueden aplicar al elemento DeleteFunction cuando este se aplica a un elemento EntityTypeMapping.

Nombre del atributo Es obligatorio Valor
FunctionName El nombre completo, calificado con el espacio de nombres, del procedimiento almacenado al que la función de eliminación está asignada. El procedimiento almacenado se debe declarar en el modelo de almacenamiento.
RowsAffectedParameter No El nombre del parámetro de salida que devuelve el número de filas afectadas.

Ejemplo

El siguiente ejemplo se basa en el modelo School y muestra el elemento DeleteFunction asignando la función de eliminación del tipo de entidad Person al procedimiento almacenado DeletePerson. El procedimiento almacenado DeletePerson se declara en el modelo de almacenamiento.

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

DeleteFunction aplicado a AssociationSetMapping

Cuando se aplica al elemento AssociationSetMapping, el elemento DeleteFunction asigna la función de eliminación de una asociación del modelo conceptual a un procedimiento almacenado.

El elemento DeleteFunction puede tener los elementos secundarios siguientes cuando se aplica a un elemento AssociationSetMapping:

  • EndProperty

Atributos aplicables

En la tabla siguiente se describen los atributos que se pueden aplicar al elemento DeleteFunction cuando este se aplica al elemento AssociationSetMapping.

Nombre del atributo Es obligatorio Valor
FunctionName El nombre completo, calificado con el espacio de nombres, del procedimiento almacenado al que la función de eliminación está asignada. El procedimiento almacenado se debe declarar en el modelo de almacenamiento.
RowsAffectedParameter No El nombre del parámetro de salida que devuelve el número de filas afectadas.

Ejemplo

El siguiente ejemplo se basa en el modelo School y muestra el elemento DeleteFunction que se utiliza para asignar la función de eliminación de la asociación CourseInstructor al procedimiento almacenado DeleteCourseInstructor. El procedimiento almacenado DeleteCourseInstructor se declara en el modelo de almacenamiento.

 <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 (Elemento) (MSL)

El elemento EndProperty del lenguaje de especificación de asignaciones (MSL) define la asignación entre un extremo o una función de modificación de una asociación de modelo conceptual y la base de datos subyacente. La asignación entre columnas y propiedades se especifica en un elemento secundario ScalarProperty.

Cuando un elemento EndProperty se utiliza para definir la asignación para el extremo de una asociación del modelo conceptual, constituye un elemento secundario de un elemento AssociationSetMapping. Cuando el elemento EndProperty se utiliza para definir la asignación para una función de modificación de una asociación del modelo conceptual, constituye un elemento secundario de un elemento InsertFunction o un elemento DeleteFunction.

El elemento EndProperty puede tener los elementos secundarios siguientes:

  • ScalarProperty (cero o más)

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento EndProperty:

Nombre del atributo Es obligatorio Valor
Nombre El nombre del extremo de la asociación que se está asignando.

Ejemplo

En el siguiente ejemplo se muestra un elemento AssociationSetMapping en el que la asociación FK_Course_Department establecida en el modelo conceptual se asigna a la tabla Course de la base de datos. Las asignaciones entre propiedades de tipo de asociación y columnas de tabla se especifican en elementos EndProperty secundarios.

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

Ejemplo

En el siguiente ejemplo se muestra el elemento EndProperty que asigna las funciones de eliminación e inserción de una asociación (CourseInstructor) a procedimientos almacenados de la base de datos subyacente. Las funciones asignadas se declaran en el modelo de almacenamiento.

 <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 (Elemento) (MSL)

El elemento EntityContainerMapping del lenguaje de especificación de asignaciones (MSL) asigna el contenedor de entidades del modelo conceptual al contenedor de entidades del modelo de almacenamiento. El elemento EntityContainerMapping es un elemento secundario del elemento Mapping.

El elemento EntityContainerMapping puede tener los elementos secundarios siguientes (en el orden mostrado):

  • EntitySetMapping (cero o más)
  • AssociationSetMapping (cero o más)
  • FunctionImportMapping (cero o más)

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento EntityContainerMapping.

Nombre del atributo Es obligatorio Valor
StorageModelContainer El nombre del contenedor de entidades del modelo de almacenamiento que se está asignando.
CdmEntityContainer El nombre del contenedor de entidades del modelo conceptual que se está asignando.
GenerateUpdateViews No True o False. Si es False, no se genera ninguna vista de actualización. Este atributo debería estar establecido en False cuando se tiene una asignación de solo lectura que no sería válida debido a que los datos no pueden realizar una operación de ida y vuelta correctamente.
El valor predeterminado es True.

Ejemplo

En el siguiente ejemplo se muestra un elemento EntityContainerMapping que asigna el contenedor SchoolModelEntities (el contenedor de entidades del modelo conceptual) al contenedor SchoolModelStoreContainer (el contenedor de entidades del modelo de almacenamiento):

 <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 (Elemento) (MSL)

El elemento EntitySetMapping del lenguaje de especificación de asignaciones (MSL) asigna todos los tipos de un conjunto de entidades del modelo conceptual a conjuntos de entidades del modelo de almacenamiento. Un conjunto de entidades del modelo conceptual es un contenedor lógico para instancias de entidades del mismo tipo (y tipos derivados). Un conjunto de entidades del modelo de almacenamiento representa una tabla o vista de la base de datos subyacente. El valor del atributo Name del elemento EntitySetMapping especifica el conjunto de entidades del modelo conceptual. La tabla o vista asignada se especifica mediante el atributo StoreEntitySet en cada elemento MappingFragment secundario o en el propio elemento EntitySetMapping.

El elemento EntitySetMapping puede tener los elementos secundarios siguientes:

  • EntityTypeMapping (cero o más)
  • QueryView (cero o uno)
  • MappingFragment (cero o más)

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento EntitySetMapping.

Nombre del atributo Es obligatorio Valor
Nombre El nombre del conjunto de entidades del modelo conceptual que se está asignando.
TypeName1 No El nombre del tipo de entidad del modelo conceptual que se está asignando.
StoreEntitySet1 No El nombre del conjunto de entidades del modelo de almacenamiento al que se está asignando.
MakeColumnsDistinct No True o False dependiendo de si solo se devuelven filas distintas.
Si este atributo está establecido en True, el atributo GenerateUpdateViews del elemento EntityContainerMapping se debe establecer en False.

 

1 Los atributos TypeName y StoreEntitySet se pueden usar en lugar de los elementos secundarios EntityTypeMapping y MappingFragment para asignar un único tipo de entidad a una única tabla.

Ejemplo

El siguiente ejemplo muestra un elemento EntitySetMapping que asigna tres tipos (un tipo base y dos tipos derivados) en el conjunto de entidades Courses del modelo conceptual a tres tablas diferentes de la base de datos subyacente. Las tablas se especifican mediante el atributo StoreEntitySet en cada elemento 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 (Elemento) (MSL)

El elemento EntityTypeMapping del lenguaje de especificación de asignaciones (MSL) define la asignación entre un tipo de entidad del modelo conceptual y las tablas o vistas de la base de datos subyacente. Para obtener información sobre los tipos de entidad del modelo conceptual y las tablas o vistas de la base de datos subyacente, consulte EntityType (Elemento) (CSDL) y EntitySet (Elemento) (SSDL). El atributo TypeName del elemento EntityTypeMapping especifica el tipo de entidad del modelo conceptual que se está asignando. El atributo StoreEntitySet del elemento MappingFragment secundario especifica la tabla o vista que se está asignando.

El elemento secundario ModificationFunctionMapping se puede utilizar para asignar las funciones de inserción, actualización o eliminación de tipos de entidad a procedimientos almacenados de la base de datos.

El elemento EntityTypeMapping puede tener los elementos secundarios siguientes:

  • MappingFragment (cero o más)
  • ModificationFunctionMapping (cero o uno)
  • ScalarProperty
  • Condition

Nota:

Los elementos MappingFragment y ModificationFunctionMapping no pueden ser elementos secundarios del elemento EntityTypeMapping al mismo tiempo.

Nota:

Los elementos ScalarProperty y Condition solo pueden ser elementos secundarios del elemento EntityTypeMapping cuando se utiliza dentro de un elemento FunctionImportMapping.

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento EntityTypeMapping.

Nombre del atributo Es obligatorio Valor
TypeName El nombre completo, calificado con el espacio de nombres, del tipo de entidad del modelo conceptual que se está asignando.
Si el tipo es abstracto o un tipo derivado, el valor debe ser IsOfType(Namespace-qualified_type_name).

Ejemplo

En el ejemplo siguiente se muestra un elemento EntitySetMapping con dos elementos EntityTypeMapping secundarios. En el primer elemento EntityTypeMapping, el tipo de entidad SchoolModel.Person se asigna a la tabla Person. En el segundo elemento EntityTypeMapping, la funcionalidad de actualización del tipo SchoolModel.Person se asigna a un procedimiento almacenado, UpdatePerson, en la base de datos.

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

Ejemplo

En el ejemplo siguiente se muestra la asignación de una jerarquía de tipos en la que el tipo raíz es abstracto. Tenga en cuenta el uso de la sintaxis IsOfType para los atributos 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 (Elemento) (MSL)

El elemento FunctionImportMapping del lenguaje de especificación de asignaciones (MSL) define la asignación entre una importación de función del modelo conceptual y un procedimiento almacenado o función de la base de datos subyacente. Las importaciones de función se deben declarar en el modelo conceptual, mientras que los procedimientos almacenados se deben declarar en el modelo de almacenamiento. Para más información, consulte Elemento FunctionImport (CSDL) y Elemento Function (SSDL).

Nota:

De forma predeterminada, si una importación de función devuelve un tipo de entidad del modelo conceptual o un tipo complejo, entonces los nombres de las columnas devueltas por el procedimiento almacenado subyacente deben coincidir exactamente con los nombres de las propiedades del tipo del modelo conceptual. Si los nombres de las columnas no coinciden exactamente con los nombres de las propiedades, la asignación se debe definir en un elemento ResultMapping.

El elemento FunctionImportMapping puede tener los elementos secundarios siguientes:

  • ResultMapping (cero o más)

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento FunctionImportMapping:

Nombre del atributo Es obligatorio Valor
FunctionImportName El nombre de la importación de función del modelo conceptual que se está asignando.
FunctionName El nombre, calificado con el espacio de nombres, de la función del modelo de almacenamiento que se está asignando.

Ejemplo

El siguiente ejemplo se basa en el modelo School. Considere la siguiente función en el modelo de almacenamiento:

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

También considere esta importación de función en el modelo conceptual:

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

El siguiente ejemplo muestra un elemento FunctionImportMapping utilizado para asignar la función y la importación de función anteriores entre sí:

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

 

InsertFunction (Elemento) (MSL)

El elemento InsertFunction del lenguaje de especificación de asignaciones (MSL) asigna la función de inserción de un tipo de entidad o asociación del modelo conceptual a un procedimiento almacenado de la base de datos subyacente. Los procedimientos almacenados a los que están asignados las funciones de modificación se deben declarar en el modelo de almacenamiento. Para obtener más información, vea Elementos de función (SSDL).

Nota:

Si no asigna las tres operaciones de inserción, actualización o eliminación de un tipo de entidad a procedimientos almacenados, se producirá un error en las operaciones no asignadas al ejecutarlas y se producirá una excepción UpdateException.

El elemento InsertFunction puede ser un elemento secundario del elemento ModificationFunctionMapping y se puede aplicar al elemento EntityTypeMapping o al elemento AssociationSetMapping.

InsertFunction aplicado a EntityTypeMapping

Cuando se aplica al elemento EntityTypeMapping, el elemento InsertFunction asigna la función de inserción de un tipo de entidad del modelo conceptual a un procedimiento almacenado.

El elemento InsertFunction puede tener los elementos secundarios siguientes cuando se aplica a un elemento EntityTypeMapping:

  • AssociationEnd (cero o más)
  • ComplexProperty (cero o más)
  • ResultBinding (cero o uno)
  • ScalarProperty (cero o más)

Atributos aplicables

En la tabla siguiente se describen los atributos que se pueden aplicar al elemento InsertFunction cuando este se aplica a un elemento EntityTypeMapping.

Nombre del atributo Es obligatorio Valor
FunctionName El nombre completo, calificado con el espacio de nombres, del procedimiento almacenado al que la función de inserción está asignada. El procedimiento almacenado se debe declarar en el modelo de almacenamiento.
RowsAffectedParameter No El nombre del parámetro de salida que devuelve el número de filas afectadas.

Ejemplo

El siguiente ejemplo se basa en el modelo School y muestra el elemento InsertFunction que se utiliza para asignar la función de inserción del tipo de entidad Person al procedimiento almacenado InsertPerson. El procedimiento almacenado InsertPerson se declara en el modelo de almacenamiento.

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

InsertFunction aplicado a AssociationSetMapping

Cuando se aplica al elemento AssociationSetMapping, el elemento InsertFunction asigna la función de inserción de una asociación del modelo conceptual a un procedimiento almacenado.

El elemento InsertFunction puede tener los elementos secundarios siguientes cuando se aplica a un elemento AssociationSetMapping:

  • EndProperty

Atributos aplicables

En la tabla siguiente se describen los atributos que se pueden aplicar al elemento InsertFunction cuando este se aplica al elemento AssociationSetMapping.

Nombre del atributo Es obligatorio Valor
FunctionName El nombre completo, calificado con el espacio de nombres, del procedimiento almacenado al que la función de inserción está asignada. El procedimiento almacenado se debe declarar en el modelo de almacenamiento.
RowsAffectedParameter No El nombre del parámetro de salida que devuelve el número de filas afectadas.

Ejemplo

El siguiente ejemplo se basa en el modelo School y muestra el elemento InsertFunction que se utiliza para asignar la función de inserción de la asociación CourseInstructor al procedimiento almacenado InsertCourseInstructor. El procedimiento almacenado InsertCourseInstructor se declara en el modelo de almacenamiento.

 <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 (Elemento) (MSL)

El elemento Mapping del lenguaje de especificación de asignaciones (MSL) contiene información para asignar objetos definidos en un modelo conceptual a una base de datos (tal y como se describe en un modelo de almacenamiento). Para más información, consulte Especificación CSDL y Especificación SSDL.

El elemento Mapping es el elemento raíz para una especificación de asignaciones. El espacio de nombres XML para las especificaciones de asignaciones es https://schemas.microsoft.com/ado/2009/11/mapping/cs.

El elemento de asignación puede tener los elementos secundarios siguientes (en el orden mostrado):

  • Alias (cero o más)
  • EntityContainerMapping (exactamente uno)

Los nombres de los tipos de modelos conceptuales y de almacenamiento a los que se hace referencia en MSL deben estar calificados con sus respectivos nombres de espacios de nombres. Para más información sobre el nombre del espacio de nombres del modelo conceptual, consulte Schema (Elemento) (CSDL). Para más información sobre el nombre del espacio de nombres del modelo de almacenamiento, consulte Schema (Elemento) (SSDL). Los alias para los espacios de nombres que se utilizan en MSL se pueden definir con el elemento Alias.

Atributos aplicables

En la tabla siguiente se describen los atributos que se pueden aplicar al elemento Mapping.

Nombre del atributo Es obligatorio Valor
Espacio C-S. Este es un valor fijo y no se puede cambiar.

Ejemplo

En el ejemplo siguiente se muestra un elemento Mapping basado en parte del modelo School. Para más información sobre el modelo School, consulte Inicio rápido: (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 (Elemento) (MSL)

El elemento MappingFragment del lenguaje de especificación de asignaciones (MSL) define la asignación entre las propiedades de un tipo de entidad del modelo conceptual y una tabla o vista de la base de datos. Para obtener información sobre los tipos de entidad del modelo conceptual y las tablas o vistas de la base de datos subyacente, consulte EntityType (Elemento) (CSDL) y EntitySet (Elemento) (SSDL). El elemento MappingFragment puede ser un elemento secundario del elemento EntityTypeMapping o el elemento EntitySetMapping.

El elemento MappingFragment puede tener los elementos secundarios siguientes:

  • ComplexType (cero o más)
  • ScalarProperty (cero o más)
  • Condition (cero o más)

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento MappingFragment.

Nombre del atributo Es obligatorio Valor
StoreEntitySet El nombre de la tabla o vista que se está asociando.
MakeColumnsDistinct No True o False dependiendo de si solo se devuelven filas distintas.
Si este atributo está establecido en True, el atributo GenerateUpdateViews del elemento EntityContainerMapping se debe establecer en False.

Ejemplo

En el ejemplo siguiente se muestra un elemento MappingFragment como elemento secundario de un elemento EntityTypeMapping. En este ejemplo, las propiedades del tipo Course en el modelo conceptual están asignadas a columnas de la tabla Course de la base de datos.

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

Ejemplo

En el ejemplo siguiente se muestra un elemento MappingFragment como elemento secundario de un elemento EntitySetMapping. Como en el ejemplo anterior, las propiedades del tipo Course del modelo conceptual se asignan a columnas de la tabla Course de la base de datos.

 <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 (Elemento) (MSL)

El elemento ModificationFunctionMapping del lenguaje de especificación de asignaciones (MSL) asigna las funciones de inserción, actualización y eliminación de un tipo de entidad del modelo conceptual a procedimientos almacenados de la base de datos subyacente. El elemento ModificationFunctionMapping también puede asignar las funciones de eliminación e inserción para asociaciones de varios a varios del modelo conceptual a procedimientos almacenados de la base de datos subyacente. Los procedimientos almacenados a los que están asignados las funciones de modificación se deben declarar en el modelo de almacenamiento. Para obtener más información, vea Elementos de función (SSDL).

Nota:

Si no asigna las tres operaciones de inserción, actualización o eliminación de un tipo de entidad a procedimientos almacenados, se producirá un error en las operaciones no asignadas al ejecutarlas y se producirá una excepción UpdateException.

Nota:

Si las funciones de modificación para una entidad de una jerarquía de herencia están asignadas a procedimientos almacenados, entonces las funciones de modificación para todos los tipos de la jerarquía deben estar asignadas a procedimientos almacenados.

El elementoModificationFunctionMapping puede ser un elemento secundario del elemento EntityTypeMapping o el elemento AssociationSetMapping.

El elemento ModificationFunctionMapping puede tener los elementos secundarios siguientes:

  • DeleteFunction (cero o uno)
  • InsertFunction (cero o uno)
  • UpdateFunction (cero o uno)

No se aplica ningún atributo al elemento ModificationFunctionMapping.

Ejemplo

En el ejemplo siguiente se muestra la asignación de conjunto de entidades para el conjunto de entidades People del modelo School. Además de la asignación de columnas para el tipo de entidad Person, se muestra la asignación de las funciones de inserción, actualización y eliminación del tipo Person. Las funciones asignadas se declaran en el modelo de almacenamiento.

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

Ejemplo

En el siguiente ejemplo se muestra la asignación del conjunto de asociaciones CourseInstructor en el modelo School. Además de la asignación de columnas para la asociación CourseInstructor, se muestra la asignación de las funciones de inserción y eliminación de la asociación CourseInstructor. Las funciones asignadas se declaran en el modelo de almacenamiento.

 <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 (Elemento) (MSL)

El elemento QueryView del lenguaje de especificación de asignaciones (MSL) define una asignación de solo lectura entre un tipo de entidad o asociación en el modelo conceptual y una tabla de la base de datos subyacente. La asignación se define con una consulta de Entity SQL que se evalúa contra el modelo de almacenamiento, mientras que el conjunto de resultados se expresa en relación a una entidad o asociación del modelo conceptual. Dado que las vistas de consulta son de solo lectura, no puede utilizar los comandos de actualización estándar para actualizar los tipos que se definen mediante vistas de consulta. Puede realizar las actualizaciones de estos tipos utilizando funciones de modificación. Para más información, consulte Asignación de funciones de modificación a procedimientos almacenados.

Nota:

En el elemento QueryView, no se admiten expresiones de Entity SQL que contengan GroupBy, agregados de grupo o propiedades de navegación.

 

El elemento QueryView puede ser un elemento secundario del elemento EntitySetMapping o el elemento AssociationSetMapping. En el primer caso, la vista de consulta define una asignación de solo lectura para una entidad del modelo conceptual. En el último caso, la vista de consulta define una asignación de solo lectura para una asociación del modelo conceptual.

Nota:

Si el elemento AssociationSetMapping está presente para una asociación con una restricción referencial, se omitirá el elemento AssociationSetMapping. Para más información, consulte Elemento ReferentialConstraint (CSDL).

El elemento QueryView no puede tener ningún elemento secundario.

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento QueryView.

Nombre del atributo Es obligatorio Valor
TypeName No El nombre del tipo de modelo conceptual que se está asignando mediante la vista de consulta.

Ejemplo

El siguiente ejemplo muestra el elemento QueryView como un elemento secundario del elemento EntitySetMapping y define una asignación de vista de consulta para el tipo de entidad Department del modelo School.

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

Dado que la consulta solo devuelve un subconjunto de los miembros del tipo Department en el modelo de almacenamiento, el tipo Department del modelo School se ha modificado según esta asignación de la forma siguiente:

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

Ejemplo

El ejemplo siguiente muestra el elemento QueryView como el elemento secundario de un elemento AssociationSetMapping y define una asignación de solo lectura para la asociación FK_Course_Department en el modelo 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>

 

Comentarios

Puede definir vistas de consulta para habilitar los escenarios siguientes:

  • Defina una entidad en el modelo conceptual que no incluya todas las propiedades de la entidad en el modelo de almacenamiento. Se incluyen las propiedades que no tienen valores predeterminados y no admiten valores null.
  • Asigne las columnas calculadas del modelo de almacenamiento a las propiedades de los tipos de entidad del modelo conceptual.
  • Defina una asignación en la que las condiciones utilizadas para dividir las entidades del modelo conceptual no se basen en la igualdad. Al especificar una asignación condicional mediante el elemento Condition, la condición proporcionada debe igualar el valor especificado. Para más información, consulte Elemento Condition (MSL).
  • Asigne la misma columna en el modelo de almacenamiento a varios tipos en el modelo conceptual.
  • Asigne varios tipos a la misma tabla.
  • Defina asociaciones en el modelo conceptual que no se basen en claves externas en el esquema relacional.
  • Utilice la lógica de negocios personalizada para establecer el valor de las propiedades del modelo conceptual. Por ejemplo, podría asignar el valor de cadena "T" en el origen de datos a un valor de true, un valor Boolean, en el modelo conceptual.
  • Defina filtros condicionales para los resultados de la consulta.
  • Aplique menos restricciones en los datos del modelo conceptual que en el modelo de almacenamiento. Por ejemplo, podría hacer que una propiedad del modelo conceptual acepte valores NULL aun cuando la columna a la que está asignada no admita valores null.

Las consideraciones siguientes se aplican al definir las vistas de consulta para las entidades:

  • Las vistas de consulta son de solo lectura. Solo puede realizar las actualizaciones a las entidades utilizando las funciones de modificación.
  • Al definir un tipo de entidad mediante una vista de consulta, también debe definir todas las entidades relacionadas mediante vistas de consulta.
  • Al asignar una asociación varios a varios a una entidad en el modelo de almacenamiento que representa una tabla de vínculos del esquema relacional, debe definir un elemento QueryView en el elemento AssociationSetMapping para esta tabla de vínculos.
  • Las vistas de consulta se deben definir para todos los tipos de una jerarquía de tipos. Puede hacerlo de las formas siguientes:
    • Con un elemento QueryView único que especifica una consulta de Entity SQL única que devuelve una unión de todos los tipos de entidad de la jerarquía.
    • Con un elemento QueryView único que especifica una consulta de Entity SQL única que utiliza al operador CASE para devolver un tipo de entidad concreto de la jerarquía según una condición concreta.
    • Con un elemento QueryView adicional para un tipo específico de la jerarquía. En este caso, utilice el atributo TypeName del elemento QueryView para especificar el tipo de entidad de cada vista.
  • Al definir una vista de consulta, no puede especificar el atributo StorageSetName en el elemento EntitySetMapping.
  • Al definir una vista de consulta, el elemento EntitySetMapping tampoco puede contener asignaciones Property.

ResultBinding (Elemento) (MSL)

El elemento ResultBinding del lenguaje de especificación de asignaciones (MSL) asigna valores de columnas devueltos por procedimientos almacenados a propiedades de entidad del modelo conceptual cuando las funciones de modificación de tipo de entidad están asignadas a procedimientos almacenados de la base de datos subyacente. Por ejemplo, cuando un procedimiento almacenado de inserción devuelve el valor de una columna de identidad, el elemento ResultBinding asigna el valor devuelto a una propiedad de tipo de entidad del modelo conceptual.

El elemento ResultBinding puede ser un elemento secundario del elemento InsertFunction o el elemento UpdateFunction.

El elemento ResultBinding no puede tener ningún elemento secundario.

Atributos aplicables

En la tabla siguiente se describen los atributos aplicables al elemento ResultBinding:

Nombre del atributo Es obligatorio Valor
Nombre El nombre de la propiedad de entidad del modelo conceptual que se está asignando.
ColumnName El nombre de la columna que se está asignando.

Ejemplo

El siguiente ejemplo se basa en el modelo School y muestra un elemento InsertFunction que se utiliza para asignar la función de inserción del tipo de entidad Person al procedimiento almacenado InsertPerson. (El procedimiento almacenado InsertPerson se muestra abajo y se declara en el modelo de almacenamiento). Se utiliza un elemento ResultBinding para asignar un valor de columna devuelto por el procedimiento almacenado (NewPersonID) a una propiedad de tipo de entidad (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>

El siguiente código Transact-SQL describe el procedimiento almacenado 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 (Elemento) (MSL)

El elemento ResultMapping del lenguaje de especificación de asignaciones (MSL) define la asignación entre una importación de función del modelo conceptual y un procedimiento almacenado de la base de datos subyacente cuando se cumple lo siguiente:

  • La importación de función devuelve un tipo de entidad del modelo conceptual o un tipo complejo.
  • Los nombres de las columnas devueltas por el procedimiento almacenado no coinciden exactamente con los nombres de las propiedades del tipo de entidad o el tipo complejo.

De forma predeterminada, la asignación entre las columnas devueltas por un procedimiento almacenado y un tipo de entidad o un tipo complejo se basa en los nombres de las propiedades y de las columnas. Si los nombres de las columnas no coinciden exactamente con los nombres de las propiedades, debe utilizar el elemento ResultMapping para definir la asignación. Para obtener un ejemplo de la asignación predeterminada, consulte Elemento FunctionImportMapping (MSL).

El elemento ResultMapping es un elemento secundario del elemento FunctionImportMapping.

El elemento ResultMapping puede tener los elementos secundarios siguientes:

  • EntityTypeMapping (cero o más)
  • ComplexTypeMapping

No se aplica ningún atributo al elemento ResultMapping.

Ejemplo

Observe el siguiente procedimiento almacenado:

 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

Considere también el siguiente tipo de entidad del modelo conceptual:

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

Para crear una importación de función que devuelva instancias del tipo de entidad anterior, la asignación entre las columnas devueltas por el procedimiento almacenado y el tipo de entidad se debe definir en un elemento 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 (Elemento) (MSL)

El elemento ScalarProperty del lenguaje de especificación de asignaciones (MSL) asigna una propiedad de un tipo de entidad del modelo conceptual, un tipo complejo, o una asociación, a una columna de una tabla o un parámetro de un procedimiento almacenado de la base de datos subyacente.

Nota:

Los procedimientos almacenados a los que están asignados las funciones de modificación se deben declarar en el modelo de almacenamiento. Para obtener más información, vea Elementos de función (SSDL).

El elemento ScalarProperty puede ser un elemento secundario de los elementos siguientes:

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

Como elemento secundario del elemento MappingFragment, ComplexProperty o EndProperty, el elemento ScalarProperty asigna una propiedad del modelo conceptual a una columna de la base de datos. Como elemento secundario del elemento InsertFunction, UpdateFunction o DeleteFunction, el elemento ScalarProperty asigna una propiedad del modelo conceptual a un parámetro de procedimiento almacenado.

El elemento ScalarProperty no puede tener ningún elemento secundario.

Atributos aplicables

Los atributos que se aplican al elemento ScalarProperty difieren dependiendo del rol del elemento.

La siguiente tabla describe los atributos aplicables cuando el elemento ScalarProperty se utiliza para asignar una propiedad del modelo conceptual a una columna de la base de datos:

Nombre del atributo Es obligatorio Valor
Nombre El nombre de la propiedad del modelo conceptual que se está asignando.
ColumnName El nombre de la columna de tabla que se está asociando.

La siguiente tabla describe los atributos aplicables al elemento ScalarProperty cuando se utiliza para asignar una propiedad del modelo conceptual a un parámetro de procedimiento almacenado:

Nombre del atributo Es obligatorio Valor
Nombre El nombre de la propiedad del modelo conceptual que se está asignando.
NombreDelParámetro El nombre del parámetro que se está asignando.
Versión No Current u Original, dependiendo de si se debe utilizar el valor actual o el valor original de la propiedad para las comprobaciones de simultaneidad.

Ejemplo

En el siguiente ejemplo se muestra el elemento ScalarProperty utilizado de dos maneras:

  • Para asignar las propiedades del tipo de entidad Person a las columnas de la tabla Person.
  • Para asignar las propiedades del tipo de entidad Person a los parámetros del procedimiento almacenado UpdatePerson. Los procedimientos almacenados se declaran en el modelo de almacenamiento.
 <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>

Ejemplo

El ejemplo siguiente muestra el elemento ScalarProperty utilizado para asignar las funciones de eliminación e inserción de una asociación del modelo conceptual a procedimientos almacenados de la base de datos. Los procedimientos almacenados se declaran en el modelo de almacenamiento.

 <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 (Elemento) (MSL)

El elemento UpdateFunction del lenguaje de especificación de asignaciones (MSL) asigna la función de actualización de un tipo de entidad del modelo conceptual a un procedimiento almacenado de la base de datos subyacente. Los procedimientos almacenados a los que están asignados las funciones de modificación se deben declarar en el modelo de almacenamiento. Para obtener más información, vea Elementos de función (SSDL).

Nota:

Si no asigna las tres operaciones de inserción, actualización o eliminación de un tipo de entidad a procedimientos almacenados, se producirá un error en las operaciones no asignadas al ejecutarlas y se producirá una excepción UpdateException.

El elemento UpdateFunction puede ser un elemento secundario del elemento ModificationFunctionMapping y aplicarse al elemento EntityTypeMapping.

El elemento UpdateFunction puede tener los elementos secundarios siguientes:

  • AssociationEnd (cero o más)
  • ComplexProperty (cero o más)
  • ResultBinding (cero o uno)
  • ScalarProperty (cero o más)

Atributos aplicables

La siguiente tabla describe los atributos que pueden aplicarse al elemento UpdateFunction.

Nombre del atributo Es obligatorio Valor
FunctionName El nombre completo, calificado con el espacio de nombres, del procedimiento almacenado al que la función de actualización está asignada. El procedimiento almacenado se debe declarar en el modelo de almacenamiento.
RowsAffectedParameter No El nombre del parámetro de salida que devuelve el número de filas afectadas.

Ejemplo

El siguiente ejemplo se basa en el modelo School y muestra el elemento UpdateFunction que se utiliza para asignar la función de actualización del tipo de entidad Person al procedimiento almacenado UpdatePerson. El procedimiento almacenado UpdatePerson se declara en el modelo de almacenamiento.

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