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 les entrées de la base de données en utilisant Entity Framework. Par défaut ont l'attribut DataContract a appliqué les entités qui sont générées automatiquement à partir de la base de données.

Malheureusement, beaucoup de champs sont exposés ne sont pas destinés à la consommation par le client (à savoir - les enregistrements de qui accède à quelles données, etc.) et pour des raisons de sécurité, je préférerais les empêcher d'être exposé. Est-il possible d'éviter les classes Entity Framework d'être exposé de cette manière?

Remarque : Ce n'est pas un double de Comment prévenir les propriétés privées dans des entités .NET d'être exposé en tant que public via des services . Dans cette question, l'utilisateur souhaite afficher de manière sélective certains domaines, alors que je voudrais l'entité de ne pas être exposé comme DataContract du tout.

Merci d'avance.

Était-ce utile?

La solution

Savez-vous que vos entités ne doivent pas nécessairement transposer un à un avec la base de données? En particulier, vous pouvez laisser des colonnes, ou même des tables entières qui ne sont pas pertinentes.

Le modèle d'entité est censée être un modèle conceptuel. Vous pouvez facilement créer un ensemble d'entités d'exposition à un ensemble de clients (services Web, peut-être), et un autre ensemble, la cartographie à la même base de données, qui est destiné à un autre client (application web, peut-être).

Par contre, je recommande toujours contre jamais exposer les objets Entity Framework via un service Web. Microsoft expose malheureusement des propriétés dépendant de la mise en œuvre en leur apposant [DataMember]. Je viens maintenant essayé avec un service simple retour d'un SalesOrderHeader de AdventureWorks. Mes versions proxy reçues des clients des types de EF suivants:

  • EntityKeyMember
  • StructuralObject
  • EntityObject
  • EntityKey
  • EntityReference
  • RelatedEnd

Ce ne sont pas des choses que vos clients ont besoin de savoir.

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

Une option que je ne l'ai pas essayé est AutoMapper .

Autres conseils

Nous utilisons des classes séparées pour les objets DataContract. Nous avons une interface avec une méthode, ToContract (), et toutes nos entités implémenter cette interface dans un fichier de classe partielle. Il est un travail supplémentaire, et il est passe-partout, mais il semble que la façon la plus simple d'obtenir la séparation et la granularité du contrôle dont nous avons besoin.

Je vois essentiellement deux choses que vous pouvez faire:

  1. Soit vous retirez les éléments que vous ne voulez pas exposer le DataContract en supprimant manuellement le [DataMember] attribut sur ces éléments; dans ce cas, WCF ne sérialiser les propriétés sur
  2. Vous définissez vos propres classes WCF DataContract avec seulement les membres que vous voulez, et vous venez avec une logique pour convertir vos entités EF à votre WCF DataContract, en utilisant par exemple quelque chose comme AutoMapper pour éliminer (ou au moins limiter) les opérations fastidieuses assigment entre les entités EF et WCF.

Marc

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top