WCF, Entity Framework et Data Contracts

datacontract entity-framework wcf

Question

Utilisation de VS 2008 et .NET 3.5 SP1:

J'utilise WCF pour permettre aux clients de se connecter à un service qui lit et écrit des entrées de base de données à l'aide d'Entity Framework. Par défaut, l'attribut DataContract est appliqué aux entités générées automatiquement à partir de la base de données.

Malheureusement, de nombreux champs exposés ne sont pas destinés à la consommation par le client (par exemple, les informations sur qui accède à quelles données, etc.) et pour des raisons de sécurité, je préfère les empêcher d'être exposés. Existe-t-il un moyen d'éviter que les classes Entity Framework soient exposées de cette manière?

Remarque : Il ne s'agit pas d'une copie de Comment empêcher les propriétés privées des entités .NET d'être exposées en tant que publiques via des services? . Dans cette question, l'utilisateur souhaite afficher de manière sélective certains champs, alors que je souhaite que l'entité ne soit pas exposée du tout comme un contrat de données.

Merci d'avance.

Réponse acceptée

Savez-vous que vos entités n'ont pas besoin de mapper un à un avec la base de données? En particulier, vous pouvez omettre des colonnes, voire des tableaux entiers non pertinents.

Le modèle d'entité est censé être un modèle conceptuel. Vous pouvez facilement créer un ensemble d'entités à exposer à un ensemble de clients (services Web, par exemple) et un autre ensemble, mappé à la même base de données, destiné à un autre client (application Web, par exemple).

D'autre part, je recommande toujours de ne jamais exposer d'objets Entity Framework via un service Web. Malheureusement, Microsoft expose les propriétés dépendantes de l'implémentation en les marquant avec [DataMember]. Je viens tout juste d'essayer cela avec un service simple renvoyant un SalesOrderHeader d'AdventureWorks. Mon client a reçu des versions de proxy des types EF suivants:

  • EntityKeyMember
  • StructuralObject
  • EntityObject
  • EntityKey
  • EntityReference
  • Connexes

Ce ne sont pas des choses que vos clients doivent savoir.

Je préfère exposer des objets de transfert de données et copier les propriétés de l'un à l'autre. Évidemment, cela est mieux fait par réflexion ou génération de code que par la main. Je l'ai fait par le biais de la génération de code dans le passé (modèles T4).

Une option que je n'ai pas essayée est AutoMapper .


Réponse populaire

Nous utilisons des classes distinctes pour les objets DataContract. Nous avons une interface avec une méthode, ToContract (), et toutes nos entités implémentent cette interface dans un fichier de classe partiel. C’est un travail supplémentaire, mais c’est le moyen le plus simple d’obtenir la séparation et la granularité du contrôle dont nous avons besoin.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow