Proveedor de reflexión (WCF Data Services)

Además de exponer los datos de un modelo de datos a través de Entity Framework, Servicios de datos de Microsoft WCF puede exponer los datos que no estén definidos estrictamente en un modelo basado en entidad. El proveedor de reflexión expone los datos en clases que devuelven tipos que implementan la interfaz IQueryable<T>. Servicios de datos de Microsoft WCF usa la reflexión con el fin de deducir un modelo de datos para estas clases y puede convertir las consultas basadas en direcciones realizadas en recursos en consultas basadas en el lenguaje de consulta integrado (LINQ) realizadas en los tipos IQueryable<T> expuestos.

Nota

Puede utilizar el método AsQueryable para devolver una interfaz de IQueryable<T> de cualquier clase que implemente la interfaz de IEnumerable<T>.Esto permite usar tipos de colección más genéricos como origen de datos para un servicio de datos.

El proveedor de reflexión admite las jerarquías de tipos. Para obtener más información, vea Cómo: Crear un servicio de datos mediante el proveedor de reflexión (WCF Data Services).

Deducir el modelo de datos

Al crear el servicio de datos, el proveedor deduce el modelo de datos por medio de la reflexión. En la lista siguiente se muestra cómo el proveedor de reflexión deduce el modelo de datos:

  • Contenedor de entidades: clase que expone los datos como propiedades que devuelven una instancia de IQueryable<T>. Al direccionar un modelo de datos basado en reflexión, el contenedor de entidades representa la raíz del servicio. Solo se admite una clase de contenedor de entidades para un espacio de nombres determinado.

  • Conjuntos de entidades: las propiedades que devuelven instancias de IQueryable<T> se tratan como conjuntos de entidades. Los conjuntos de entidades se direccionan directamente como recursos en la consulta. Solo una propiedad del contenedor de entidades puede devolver una instancia de IQueryable<T> de un tipo determinado.

  • Tipos de entidad: el tipo T del IQueryable<T> que devuelve el tipo de entidad. El proveedor de reflexión convierte las clases que forman parte de una jerarquía de herencia en una jerarquía de tipos de entidad equivalente.

  • Claves de entidad: cada clase de datos que es un tipo de entidad debe tener una propiedad clave. Esta propiedad recibe el atributo DataServiceKeyAttribute ([DataServiceKeyAttribute]).

    Nota

    Solo debe aplicar el atributo DataServiceKeyAttribute a una propiedad que se pueda usar para identificar una instancia de forma única del tipo de entidad.Este atributo se ignora cuando se aplica a una propiedad de navegación.

  • Propiedades de tipo de entidad: aparte de la clave de entidad, el proveedor de reflexión trata las propiedades accesibles no de indizador de una clase que no sea un tipo de entidad como se explica a continuación:

    • Si la propiedad devuelve un tipo primitivo, se supone que es una propiedad de un tipo de entidad.

    • Si la propiedad devuelve un tipo que también es un tipo de entidad, se supone que es una propiedad de navegación que representa el extremo "uno" de una relación varios a uno o uno a uno.

    • Si la propiedad devuelve un IEnumerable<T> de un tipo de entidad, se supone que es una propiedad de navegación que representa el extremo "varios" de una relación uno a uno o varios a varios.

    • Si el tipo devuelto de la propiedad es un tipo de valor, la propiedad representa un tipo complejo.

Nota

A diferencia de un modelo de datos que está basado en el modelo de entidad-relación, los modelos que están basados en el proveedor de reflexión no entienden los datos relacionales.Debe usar Entity Framework para exponer los datos relacionales a través de Servicios de datos de Microsoft WCF.

Asignación de tipos de datos

Cuando un modelo de datos se deduce de las clases de .NET Framework, los tipos primitivos del modelo se asignan a los tipos de datos de .NET Framework de la siguiente forma:

Tipo de datos de .NET Framework

Tipo del modelo de datos

Byte[]

Edm.Binary

Boolean

Edm.Boolean

Byte

Edm.Byte

DateTime

Edm.DateTime

Decimal

Edm.Decimal

Double

Edm.Double

Guid

Edm.Guid

Int16

Edm.Int16

Int32

Edm.Int32

Int64

Edm.Int64

SByte

Edm.SByte

Single

Edm.Single

String

Edm.String

Nota

Los tipos de valor NULL de .NET Framework se asignan a los mismo tipos del modelo de datos que los tipos de valor correspondientes a los que no se puede asignar un valor NULL.

Habilitar las actualizaciones en el modelo de datos

Para permitir las actualizaciones de los datos que se exponen a través de este tipo de modelo de datos, el proveedor de reflexión define una interfaz IUpdatable. Esta interfaz indica al servicio de datos cómo conservar las actualizaciones de los tipos expuestos. Para permitir las actualizaciones de los recursos que define el modelo de datos, la clase de contenedor de entidades debe implementar la interfaz de IUpdatable. Para obtener un ejemplo de una implementación de la interfaz de IUpdatable, vea Cómo: Crear un servicio de datos mediante un origen de datos LINQ to SQL (WCF Data Services).

La interfaz IUpdatable necesita la implementación de los siguientes miembros para que las actualizaciones puedan propagarse al origen de datos por medio del proveedor de reflexión:

Miembro

Descripción

AddReferenceToCollection

Proporciona la funcionalidad para agregar un objeto a una colección de objetos relacionados a los que se tiene acceso desde una propiedad de navegación.

ClearChanges

Proporciona la funcionalidad que cancela los cambios pendientes de los datos.

CreateResource

Proporciona la funcionalidad para crear un recurso nuevo en el contenedor especificado.

DeleteResource

Proporciona la funcionalidad para eliminar un recurso.

GetResource

Proporciona la funcionalidad para recuperar un recurso que se identifica por una consulta y un nombre de tipo concretos.

GetValue

Proporciona la funcionalidad para devolver el valor de una propiedad de un recurso.

RemoveReferenceFromCollection

Proporciona la funcionalidad para quitar un objeto de una colección de objetos relacionados a los que se tiene acceso desde una propiedad de navegación.

ResetResource

Proporciona la funcionalidad para actualizar un recurso especificado.

ResolveResource

Proporciona la funcionalidad para devolver el recurso que se representa por una instancia de objeto concreta.

SaveChanges

Proporciona la funcionalidad para guardar todos los cambios pendientes.

SetReference

Proporciona la funcionalidad para establecer una referencia a objeto relacionada mediante una propiedad de navegación.

SetValue

Proporciona la funcionalidad para establecer el valor de propiedad de un recurso.

Administrar la simultaneidad

Servicios de datos de Microsoft WCF admite un modelo de la simultaneidad optimista al permitirle definir un token de simultaneidad para una entidad. El servicio de datos utiliza este token de simultaneidad, que incluye una o más propiedades de la entidad, para determinar si se ha producido un cambio en los datos que se solicitan, que se están actualizando o eliminando. Cuando los valores de token obtenidos de la eTag de la solicitud difieren de los valores actuales de la entidad, el servicio de datos inicia una excepción. ETagAttribute se aplica a un tipo de entidad para definir un token de simultaneidad en el proveedor de reflexión. El token de simultaneidad no puede incluir ninguna propiedad clave ni de navegación. Para obtener más información, vea Actualizar el servicio de datos (WCF Data Services).

Usar LINQ to SQL con el proveedor de reflexión

Dado que Entity Framework se admite nativamente de forma predeterminada, es el proveedor de datos recomendado para usar datos relacionales con Servicios de datos de Microsoft WCF. Sin embargo, puede usar el proveedor de reflexión para usar las clases LINQ to SQL con un servicio de datos. Los conjuntos de resultados Table<TEntity> que devuelven los métodos en el DataContext generado por el Object Relational Designer del LINQ to SQL implementan la interfaz IQueryable<T>. Esto permite que el proveedor de reflexión tenga acceso a estos métodos y datos de entidades devueltos en SQL Server utilizando las clases LINQ to SQL generadas. Sin embargo, dado que LINQ to SQL no implementa la interfaz de IUpdatable, necesita agregar una clase parcial que extiende la clase parcial existente DataContext para agregar la implementación IUpdatable. Para obtener más información, vea Cómo: Crear un servicio de datos mediante un origen de datos LINQ to SQL (WCF Data Services).

Vea también

Conceptos

Proveedores de servicios de datos (WCF Data Services)