Fournisseur de réflexion (WCF Data Services)
En plus d'exposer des données d'un modèle de données via Entity Framework, Services de données WCF peut exposer des données qui ne sont pas définies strictement dans un modèle basé sur une entité. Le fournisseur de réflexion expose des données dans les classes qui retournent des types implémentant l'interface IQueryable. Services de données WCF utilise la réflexion pour déduire un modèle de données pour ces classes et peut traduire des requêtes basées sur une adresse sur des ressources en requêtes LINQ (Language Integrated Query) en fonction des types IQueryable exposés.
Remarque : |
---|
Vous pouvez utiliser la méthode AsQueryable pour retourner une interface IQueryable à partir des classes qui implémentent l'interface IEnumerable.De cette manière, la plupart des types de collection génériques peuvent être utilisé comme une source de données pour votre service de données. |
Le fournisseur de réflexion prend en charge des hiérarchies de types. Pour plus d'informations, consultez Procédure : créer un service de données à l'aide du fournisseur de réflexion (WCF Data Services).
Déduction du modèle de données
Lorsque vous créez le service de données, le fournisseur déduit le modèle de données à l'aide de la réflexion. La liste suivante montre comment le fournisseur de réflexion déduit le modèle de données :
Conteneur d'entités - classe qui expose les données en tant que propriétés qui retournent une instance IQueryable. Lorsque vous adressez un modèle de données basé sur la réflexion, le conteneur d'entités représente la racine du service. Une seule classe de conteneur d'entités est prise en charge pour un espace de noms donné.
Jeux d'entités - les propriétés qui retournent des instances IQueryable sont traitées comme des jeux d'entités. Les jeux d'entités sont adressés directement comme des ressources dans la requête. Une seule propriété sur le conteneur d'entités peut retourner une instance IQueryable d'un type donné.
Types d'entité - type T du IQueryable que retourne le jeu d'entités. Les classes qui appartiennent à une hiérarchie d'héritage sont traduites par le fournisseur de réflexion en une hiérarchie des types d'entités équivalente.
Clés d'entité - chaque classe de données qui est un type d'entité doit avoir une propriété de clé. Cette propriété possède l'attribut DataServiceKeyAttribute (
[DataServiceKeyAttribute]
).Remarque : Vous devez appliquer uniquement l'attribut DataServiceKeyAttribute à une propriété qui peut être utilisée pour identifier de manière unique une instance du type d'entité.Cet attribut est ignoré en cas d'application à une propriété de navigation. Propriétés de type d'entité - outre la clé d'entité, le fournisseur de réflexion traite les propriétés de non-indexeur accessibles d'une classe qui est un type d'entité comme suit :
Si la propriété retourne un type primitif, il est supposé que la propriété est une propriété d'un type d'entité.
Si la propriété retourne un type qui est également un type d'entité, il est supposé que la propriété est une propriété de navigation qui représente la terminaison « un » d'une relation plusieurs-à-un ou un-à-un.
Si la propriété retourne un IEnumerable d'un type d'entité, il est supposé que la propriété est une propriété de navigation qui représente la terminaison « plusieurs » d'une relation plusieurs-à-un ou un-à-plusieurs.
Si le type de retour de la propriété est un type de valeur, alors la propriété représente un type complexe.
Remarque : |
---|
Contrairement à un modèle de données basé sur le modèle relationnel d'entités, les modèles basés sur le fournisseur de réflexion ne comprennent pas de données relationnelles.Vous devez utiliser Entity Framework pour exposer des données relationnelles via Services de données WCF . |
Mappage des types de données
Lorsqu'un modèle de données est déduit des classes .NET Framework, les types primitifs dans le modèle de données sont mappés aux types de données .NET Framework comme suit:
Types de données .NET Framework | Type de modèle de données |
---|---|
Byte [] |
Edm.Binary |
Edm.Boolean |
|
Byte |
Edm.Byte |
Edm.DateTime |
|
Edm.Decimal |
|
Edm.Double |
|
Edm.Guid |
|
Edm.Int16 |
|
Edm.Int32 |
|
Edm.Int64 |
|
Edm.SByte |
|
Edm.Single |
|
Edm.String |
Remarque : |
---|
Les types de valeurs Nullable .NET Framework sont mappés aux mêmes types de modèles de données que les types de valeurs correspondants auxquels il n'est pas possible d'affecter une valeur Null. |
Autorisation des mises à jour dans le modèle de données
Pour autoriser les mises à jour des données exposées via ce type de modèle de données, le fournisseur de réflexion définit une interface IUpdatable. Cette interface instruit le service de données sur la manière de rendre les mises à jour persistantes aux types exposés. Pour permettre des mises à jour aux ressources définies par le modèle de données, la classe de conteneur d'entités doit implémenter l'interface IUpdatable. Pour obtenir un exemple d'une implémentation de l'interface IUpdatable, consultez Procédure : créer un service de données à l'aide d'une source de données LINQ to SQL (WCF Data Services).
L'interface IUpdatable requiert que les membres suivants soient implémentés afin que les mises à jour puissent être propagées à la source de données à l'aide du fournisseur de réflexion :
Membre | Description |
---|---|
Fournit les fonctionnalités pour ajouter un objet à une collection d'objets connexes accessibles depuis une propriété de navigation. |
|
Fournit les fonctionnalités qui annulent des modifications en attente aux données. |
|
Fournit les fonctionnalités pour créer une ressource dans le conteneur spécifié. |
|
Fournit les fonctionnalités pour supprimer une ressource. |
|
Fournit les fonctionnalités pour récupérer une ressource identifiée par une requête et un nom de type spécifiques. |
|
Fournit les fonctionnalités pour retourner la valeur d'une propriété d'une ressource. |
|
Fournit les fonctionnalités pour supprimer un objet d'une collection d'objets connexes accessibles depuis une propriété de navigation. |
|
Fournit les fonctionnalités pour mettre à jour une ressource spécifiée. |
|
Fournit les fonctionnalités pour retourner la ressource représentée par une instance d'objet spécifique. |
|
Fournit les fonctionnalités pour enregistrer toutes les modifications en attente. |
|
Fournit les fonctionnalités pour définir une référence d'objet connexe à l'aide d'une propriété de navigation. |
|
Fournit les fonctionnalités pour définir la valeur de la propriété d'une ressource. |
Gestion de l'accès concurrentiel
Services de données WCF prend en charge un modèle d'accès concurrentiel optimiste en vous permettant de définir un jeton d'accès concurrentiel pour une entité. Ce jeton d'accès concurrentiel, qui inclut une ou plusieurs propriétés de l'entité, est utilisé par le service de données pour déterminer si une modification a eu lieu dans les données demandées, mises à jour ou supprimées. Lorsque les valeurs du jeton obtenues de l'eTag dans la demande diffèrent des valeurs actuelles de l'entité, le service de données déclenche une exception. L'objet ETagAttribute est appliqué à un type d'entité pour définir un jeton d'accès concurrentiel dans le fournisseur de réflexion. Le jeton d'accès concurrentiel ne peut pas inclure une propriété de clé ou de navigation. Pour plus d'informations, consultez Making Changes to Data (WCF Data Services).
Utilisation de LINQ to SQL avec le fournisseur de réflexion
Comme Entity Framework est pris en charge en mode natif par défaut, il s'agit du fournisseur de données recommandé pour l'utilisation de données relationnelles avec Services de données WCF . Toutefois, vous pouvez utiliser le fournisseur de réflexion pour utiliser les classes LINQ to SQL avec un service de données. Les jeux de résultats Table retournés par les méthodes sur le DataContext généré par le Concepteur Objet/Relationnel LINQ to SQL (Concepteur O/R) implémentent l'interface IQueryable. Cela permet au fournisseur de réflexion d'accéder à ces méthodes et de retourner les données d'entité de SQL Server en utilisant les classes LINQ to SQL générées. Toutefois, comme LINQ to SQL n'implémente pas l'interface IUpdatable, vous devez ajouter une classe partielle qui étend la classe partielle DataContext existante pour ajouter l'implémentation IUpdatable. Pour plus d'informations, consultez Procédure : créer un service de données à l'aide d'une source de données LINQ to SQL (WCF Data Services).