Utilisation d'entités POCO (Entity Framework)

Entity Framework vous permet d'utiliser des classes de données personnalisées avec votre modèle de données sans modifier les classes de données elles-mêmes. Cela signifie que vous pouvez utiliser des objets CLR « classiques » (ou POCO), tels que les objets de domaine existants, avec votre modèle de données. Ces classes de données POCO (également appelées objets qui ignorent la persistance), qui sont mappées aux entités définies dans un modèle de données, prennent en charge la plupart des comportements de requête, d'insertion, de mise à jour et de suppression des types d'entité générés par les outils Entity Data Model .

Spécifications de mappage

Pour utiliser des entités POCO avec un modèle de données, le nom du type d'entité doit être identique à celui de la classe de données personnalisée, et chaque propriété du type d'entité doit se mapper à une propriété publique de la classe de données personnalisée. Le nom des types et chaque propriété mappée doivent être équivalents. Pour plus d'informations sur la modification d'entités dans un modèle conceptuel, consultez How to: Create and Modify Entity Types.

Dd456853.note(fr-fr,VS.100).gifRemarque :
Le mappage d'entités POCO n'est pas pris en charge si des attributs de mappage sont appliqués aux classes de données personnalisées, notamment EdmSchemaAttribute au niveau de l'assembly.

Vous pouvez utiliser le modèle POCO pour générer des types d'entité ignorant la persistance à partir d'un modèle conceptuel. Le modèle n'est pas inclus dans Visual Studio mais peut être téléchargé à partir de la galerie Visual Studiohttps://go.microsoft.com/fwlink/?LinkId=184985.

Création d'objet proxy

Si vous voulez que Entity Framework assure le suivi des modifications dans vos classes POCO à mesure que les modifications interviennent et qu'il prenne en charge le chargement différé des objets connexes, vos classes POCO doivent répondre aux spécifications décrites dans la rubrique Spécifications pour la création de proxys POCO (Entity Framework).

Lorsque la création d'objet proxy est activée pour les entités POCO, les modifications apportées au graphique et aux valeurs de propriété des objets sont automatiquement suivies par Entity Framework à mesure qu'elles se produisent. Pour plus d'informations sur les options de suivi des modifications avec et sans proxys, consultez Suivi des modifications dans les entités POCO (Entity Framework).

Vous pouvez combiner des entités POCO et des objets entité proxy. Pour désactiver la création d'objets proxy, attribuez à la propriété ProxyCreationEnabled la valeur false sur l'instance de l'objet ObjectContextOptions retournée par la propriété ContextOptions de l'objet ObjectContext :

' Disable proxy object creation. 
context.ContextOptions.ProxyCreationEnabled = False
// Disable proxy object creation.
context.ContextOptions.ProxyCreationEnabled = false;

Pour plus d'informations, consultez Procédure : créer une entité POCO avec les proxys (Entity Framework).

Sérialisation de proxys POCO

Windows Communication Foundation (WCF) ne peut pas sérialiser ou désérialiser directement les proxys, car l'objet DataContractSerializer ne peut sérialiser et désérialiser que les types connus, et les types de proxy ne le sont pas. Lorsque vous devez sérialiser des entités POCO, désactivez la création de proxy ou utilisez la classe ProxyDataContractResolver pour sérialiser les objets proxy comme les entités POCO d'origine. Pour désactiver la création de proxy, attribuez à la propriété ProxyCreationEnabled la valeur false.

La classe ProxyDataContractResolver mappe les types de proxy aux types POCO pendant la sérialisation. Pour donner instruction à l'objet DataContractSerializer d'utiliser la classe ProxyDataContractResolver dans les opérations de service, définissez une classe d'attributs (qui s'appliquera aux opérations de service) qui utilise en interne l'objet ProxyDataContractResolver pour mapper les types de proxy aux types POCO purs. Associez cette classe d'attributs aux méthodes qui font partie d'un contrat de service dans votre application WCF.

Le client reçoit et désérialise les entités POCO réelles. Ces classes n'ont pas les capacités de chargement différé et de suivi des modifications des objets proxy. Pour suivre les modifications dans ces entités à travers différentes couches, utilisez des entités de suivi automatique. Les entités de suivi automatique sont des entités POCO qui ne dépendent pas d'Entity Framework et possèdent leur propre logique de suivi des modifications. Pour plus d'informations, consultez Procédure pas à pas : sérialiser des entités de suivi automatique (Entity Framework).

Pour plus d'informations, consultez Procédure pas à pas : sérialiser des proxys POCO avec WCF (Entity Framework).

Les objets proxy peuvent être sérialisés et désérialisés avec la sérialisation binaire. Toutefois, lorsque vous sérialisez un graphique d'objet au-delà des limites de AppDomain, vous devez vous assurer que les définitions de type de proxy existent dans l'environnement cible. Si les types n'existent pas, la désérialisation échoue. Pour s'assurer que le type existe, utilisez CreateProxyTypes.

Dd456853.note(fr-fr,VS.100).gifRemarque :
Même si un objet de type proxy est créé, il n'a pas les capacités de chargement différé et de suivi des modifications d'un proxy.

Avec la sérialisation binaire et la sérialisation de contrat de données, les objets connexes sont sérialisés en même temps que l'objet primaire. Le chargement différé exécute une requête lors de chaque accès à une propriété de navigation de relation, et les sérialiseurs binaire et de contrat de données WCF accèdent à toutes les propriétés de navigation de relation. Cela peut donner lieu à l'exécution de nombreuses requêtes inattendues pendant la sérialisation. Si vous ne désactivez pas la génération de type de proxy (ce qui désactive le chargement différé), désactivez explicitement le chargement différé comme dans l'exemple suivant.

' Disable lazy loading. 
context.ContextOptions.LazyLoadingEnabled = False
// Disable lazy loading.
context.ContextOptions.LazyLoadingEnabled = false;

Pour plus d'informations, consultez Sérialisation d'objets (Entity Framework).

Récapitulatif des API propres aux proxys

Les API suivantes s'avèrent utiles lors de l'utilisation de proxys POCO :

Membre Description

CreateObject

Crée un objet proxy POCO si votre classe POCO remplit les conditions décrites dans la rubrique Spécifications pour la création de proxys POCO (Entity Framework) et si la propriété ProxyCreationEnabled a la valeur true ; sinon, crée un objet correspondant à un type d'argument générique. L'argument générique de cette méthode peut être n'importe quel type référence concret (les classes, interfaces et types de valeur abstraits ne sont pas pris en charge). Si le type générique est un type CLR non mappé au modèle conceptuel ou un type qui ne remplit pas les conditions de création de proxy, la méthode essaie d'utiliser un constructeur sans paramètre du type transmis pour créer et retourner une nouvelle instance du type. Outre la méthode CreateObject au niveau de l'objet ObjectContext, vous pouvez appliquer les méthodes CreateObject et CreateObject à l'objet ObjectSet. Pour plus d'informations, consultez Procédure : créer une entité POCO avec les proxys (Entity Framework).

Cette méthode n'ajoute pas l'objet créé au contexte de l'objet. Pour ajouter l'objet au contexte, vous devez utiliser les méthodes décrites dans la rubrique Création, ajout, modification et suppression d'objets (Entity Framework).

ProxyCreationEnabled

Si cet indicateur a la valeur true, Entity Framework essaie de créer des proxys pour vos entités POCO. Par défaut, l'indicateur ProxyCreationEnabled a la valeur true.

GetObjectType

System.Data.Objects.ObjectContext.GetObjectType(System.Type) est une méthode statique qui retourne le type POCO dont est dérivé le proxy spécifié si un type de proxy a été transmis sous forme d'argument. Si le type transmis ne représente pas un proxy, le même type est retourné par cette méthode.

CreateProxyTypes

Crée un jeu de types de proxy pour les types POCO spécifiés en fonction des métadonnées chargées dans l'objet ObjectContext. Cette méthode n'instancie pas d'objets correspondant aux types de proxy créés. Par exemple, le code suivant crée des proxys pour les classes POCO Customer et Order : context.CreateProxyTypes(new Type[] { typeof(Customer), typeof(Order) });

Lorsque vous chargez des objets à partir de la source de données ou que vous avez créé des objets à l'aide de la méthode CreateObject, Entity Framework crée des types de proxy pour vos classes POCO pendant l'exécution. Toutefois, dans certains cas, vous pouvez souhaiter créer les types de proxy à l'avance. Par exemple, lors de la sérialisation d'un graphique d'objet au-delà des limites de AppDomain, vous pouvez souhaiter vous assurer que les types de proxy existent bien dans l'environnement cible. Si les types n'existent pas, la désérialisation échoue.

GetKnownProxyTypes

GetKnownProxyTypes est une méthode statique qui retourne une énumération contenant tous les types de proxy qui ont été créés jusque-là dans l'objet AppDomain. Dans les scénarios de sérialisation, la méthode peut être utilisée pour obtenir tous les types que l'environnement cible est censé déjà contenir et que le sérialiseur est supposé reconnaître.

Dans cette section

Spécifications pour la création de proxys POCO (Entity Framework)

Chargement d'entités POCO connexes (Entity Framework)

Suivi des modifications dans les entités POCO (Entity Framework)

Procédure : définir des entités POCO (Entity Framework)

Procédure: définir un contexte d'objet personnalisé (Entity Framework)

Procédure : personnaliser des fichiers de modèle et de mappage pour utiliser des objets personnalisés (Entity Framework)

Procédure: définir un contexte d'objet personnalisé (Entity Framework)

Procédure : créer une entité POCO avec les proxys (Entity Framework)

Procédure : charger explicitement des entités POCO (Entity Framework)

Procédure : détecter les modifications dans les entités POCO

Procédure : modifier les relations entre des entités POCO (Entity Framework)

Voici une série de publications sur les objets POCO provenant du blog ADO.NET (en anglais).

POCO

POCO in the Entity Framework 4 - Part 2

POCO in the Entity Framework 4 - Part 3

Voir aussi

Concepts

Personnalisation des objets (Entity Framework)
Définition et gestion des relations (Entity Framework)