Cómo: Agregar una consulta de definición (Entity Framework)

En este tema se describe cómo agregar una consulta de definición y el tipo de entidad conceptual correspondiente a un archivo .edmx. Una consulta de definición permite ejecutar una instrucción SQL especificada en el elemento DefiningQuery de un archivo .edmx. Para obtener más información, vea DefiningQuery Element (EntitiContainer SSDL). Normalmente, las consultas de definición se usan para proporcionar una funcionalidad similar a la de las vistas de base de datos, pero en este caso la vista se define en el archivo .edmx, no en la base de datos. El tipo de entidad conceptual se usa para mostrar los datos expuestos por la consulta de definición en la capa conceptual.

Cc982038.note(es-es,VS.100).gifNota:
Los cambios efectuados en el modelo de almacenamiento, incluida la definición de consultas, se invalidarán cuando ejecute el Asistente para actualizar modelo.

Las consultas con parámetros no se pueden ejecutar como consultas de definición. De forma predeterminada, los datos que se muestran usando una consulta de definición son de solo lectura. Sin embargo, los datos se pueden actualizar asignando las funciones de inserción, actualización y eliminación del tipo de entidad que los muestra a los procedimientos almacenados. Para obtener más información, vea Cómo: Asignar funciones de modificación a procedimientos almacenados (herramientas de Entity Data Model) y Tutorial: Asignar una entidad a procedimientos administrados (Herramientas de Entity Data Model).

Los procedimientos siguientes proporcionan un esquema de general de cómo agregar una consulta de definición y un tipo de entidad conceptual a un archivo .edmx. El ejemplo que les sigue proporciona más detalles sobre los pasos de los procedimientos.

Los procedimientos dan por hecho que hay un archivo .edmx válido abierto en Visual Studio.

Agregar una consulta de definición

Para agregar una consulta de definición

  1. Agregue un elemento EntitySet a la sección SSDL del archivo .edmx. Especifique solo los atributos Name y EntityType del elemento EntitySet. Para obtener más información, vea EntitySet Element (EntityContainer SSDL).

  2. Agregue un elemento DefiningQuery al elemento EntitySet agregado recientemente. Especifique la instrucción SQL que se va a ejecutar en el cuerpo del elemento DefiningQuery. Para obtener más información, vea DefiningQuery Element (EntitiContainer SSDL).

  3. Agregue un elemento EntityType a la sección SSDL del archivo .edmx. Este elemento EntityType debe describir las columnas devueltas por la instrucción SQL en el elemento DefiningQuery. Para obtener más información, vea EntityType Element (SSDL).

Agregar un tipo de entidad al modelo conceptual

Para agregar un tipo de entidad conceptual

  1. Agregue un elemento EntitySet a la sección CSDL del archivo .edmx. Para obtener más información, vea EntitySet Element (EntityContainer CSDL).

  2. Agregue un elemento EntityType a la sección CSDL del archivo .edmx. El atributo Name debe tener el mismo valor que el atributo Name del elemento EntitySet del paso anterior. Las propiedades del tipo de entidad deberían corresponderse con los datos devueltos por la instrucción SQL especificada en el elemento DefiningQuery del procedimiento anterior. Para obtener más información, vea EntityType Element (CSDL).

Asignar los tipos de entidad conceptuales y de almacenamiento

Para asignar los tipos de entidad conceptuales y de almacenamiento

  1. Agregue un elemento EntitySetMapping a la sección de asignación del archivo .edmx que asigne las entidades conceptuales y de almacenamiento de los dos procedimientos anteriores. Para obtener más información, vea EntitySetMapping Element (MSL) y Mapping a Conceptual Model to a Storage Schema.

Ejemplo

En el ejemplo siguiente se agrega una consulta de definición al archivo School.edmx para mostrar información sobre las notas de los alumnos con un tipo de entidad GradeReport. El archivo School.edmx se puede generar siguiendo los pasos descritos en el tema Generar el Entity Data Model School del Quickstart de Entity Framework.

Para agregar una consulta de definición, agregue primero el elemento EntitySet siguiente (que contiene un elemento DefiningQuery) a la sección SSDL del archivo .edmx. Tenga en cuenta los siguientes extremos:

  • Solo se especifican los atributos Name y EntityType del elemento EntitySet.

  • En el atributo EntityType se usa el nombre completo del tipo de entidad.

  • La instrucción SQL que se va a ejecutar se especifica en el elemento DefiningQuery.

<EntitySet Name="GradeReport"
 EntityType="SchoolModel.Store.GradeReport" >
  <DefiningQuery>
    SELECT CourseID, Grade, FirstName, LastName
    FROM StudentGrade
    JOIN
    (SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
    ON StudentID = p.PersonID
  </DefiningQuery>
</EntitySet>

A continuación, se agrega el elemento EntityType siguiente a la sección SSDL del archivo .edmx. Tenga en cuenta los siguientes extremos:

  • El valor del atributo Name corresponde al valor del atributo EntityType del elemento EntitySet anterior, aunque el nombre completo del tipo de entidad se usa en el atributo EntityType.

  • Los nombres de propiedad corresponden a los nombres de columna devueltos por la instrucción SQL en el elemento DefiningQuery citado anteriormente.

  • En este ejemplo, la clave de entidad consta de tres propiedades para garantizar un valor de clave único.

<EntityType Name="GradeReport">
  <Key>
    <PropertyRef Name="CourseID" />
    <PropertyRef Name="FirstName" />
    <PropertyRef Name="LastName" />
  </Key>
  <Property Name="CourseID"
            Type="int"
            Nullable="false" />
  <Property Name="Grade"
            Type="decimal"
            Precision="3"
            Scale="2" />
  <Property Name="FirstName"
            Type="nvarchar"
            Nullable="false"
            MaxLength="50" />
  <Property Name="LastName"
            Type="nvarchar"
            Nullable="false"
            MaxLength="50" />
</EntityType>

Para agregar un tipo de entidad al modelo conceptual, agregue primero el elemento EntitySet siguiente la sección CSDL del archivo .edmx. Tenga en cuenta que el nombre completo del tipo de entidad se usa en el atributo EntityType.

<EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />

A continuación, se agrega el elemento EntityType siguiente a la sección SSDL del archivo .edmx. Tenga en cuenta los siguientes extremos:

  • El valor del atributo Name corresponde al valor del atributo EntityType del elemento EntitySet anterior, aunque el nombre completo del tipo de entidad se usa en el atributo EntityType.

  • Los nombres de propiedad corresponden a los nombres de columna devueltos por la instrucción SQL en el elemento DefiningQuery citado anteriormente.

  • En este ejemplo, la clave de entidad consta de tres propiedades para garantizar un valor de clave único.

<EntityType Name="GradeReport">
  <Key>
    <PropertyRef Name="CourseID" />
    <PropertyRef Name="FirstName" />
    <PropertyRef Name="LastName" />
  </Key>
  <Property Name="CourseID"
            Type="Int32"
            Nullable="false" />
  <Property Name="Grade"
            Type="Decimal"
            Precision="3"
            Scale="2" />
  <Property Name="FirstName"
            Type="String"
            Nullable="false"
            MaxLength="50"
            Unicode="true"
            FixedLength="false" />
  <Property Name="LastName"
            Type="String"
            Nullable="false"
            MaxLength="50"
            Unicode="true"
            FixedLength="false" />
</EntityType>

Para asignar los tipos de entidad conceptuales y de almacenamiento, agregue el elemento EntitySetMapping siguiente a la sección de asignación del archivo .edmx.

<EntitySetMapping Name="GradeReport">
  <EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
    <MappingFragment StoreEntitySet="GradeReport">
      <ScalarProperty Name="CourseID" ColumnName="CourseID" />
      <ScalarProperty Name="Grade" ColumnName="Grade" />
      <ScalarProperty Name="FirstName" ColumnName="FirstName" />
      <ScalarProperty Name="LastName" ColumnName="LastName" />
    </MappingFragment>
  </EntityTypeMapping>
</EntitySetMapping>

El tipo de entidad GradeReport se agrega al modelo School. Tenga en cuenta que los datos mostrados a través del tipo de entidad GradeReport son de solo lectura.

Vea también

Conceptos

Información general sobre el archivo .edmx (Entity Framework)

Otros recursos

Editar un archivo .edmx manualmente (Entity Framework)