Matérialisation d'objets (WCF Data Services)
Lorsque vous utilisez la boîte de dialogue Ajouter une référence de service pour consommer un flux Protocole OData (Open Data) dans une application cliente .NET Framework, les classes de données équivalentes sont générées pour chaque type d'entité dans le modèle de données exposé par le flux. Pour plus d'informations, consultez Génération de classes de service de données client (WCF Data Services). Les données d'entité retournées par une requête sont matérialisées dans une instance de l'une de ces classes de service de données client générées. Pour plus d'informations sur les options de fusion et la résolution d'identité des objets tracés, consultez Gérer le contexte du service de données (WCF Data Services).
Services de données WCF vous permet également de définir vos propres classes de service de données client plutôt que d'utiliser les classes de données générées par outil. Cela vous permet d'utiliser vos propres classes de données, également appelées classes de données POCO (plain-old CLR object). Lorsque vous utilisez ces types de classes de données personnalisées, vous devez attribuer la classe de données avec DataServiceKeyAttribute ou DataServiceEntityAttribute et vérifier que les noms de type sur le client correspondent aux noms de type du modèle de données du service de données.
Matérialiser des entités à partir d'une réponse à une requête
Lorsque la bibliothèque reçoit le message de réponse à la requête, elle matérialise les données retournées du flux OData en instances des classes de service de données client qui sont du type de la requête. Le processus général pour matérialiser ces objets est le suivant :
La bibliothèque cliente lit le type sérialisé de l'élément entry dans le flux du message de réponse et tente de créer une nouvelle instance du type correct, de l'une des manières suivantes :
Lorsque le type déclaré dans le flux a le même nom que le type DataServiceQuery<TElement>, une nouvelle instance de ce type est créée à l'aide du constructeur vide.
Lorsque le type déclaré dans le flux a le même nom qu'un type dérivé du type DataServiceQuery<TElement>, une nouvelle instance de ce type dérivé est créée à l'aide du constructeur vide.
Lorsque le type déclaré dans le flux ne correspond pas au type DataServiceQuery<TElement> ou à tout type dérivé, une nouvelle instance du type demandé est créée à l'aide du constructeur vide.
Lorsque la propriété ResolveType est définie, le délégué fourni est appelé pour remplacer le mappage du type basé sur le nom par défaut et une nouvelle instance du type retourné par Func<T, TResult> est créée à la place. Si ce délégué retourne une valeur Null, une nouvelle instance du type demandé est créée à la place. Il se peut que vous deviez remplacer le mappage du nom du type basé sur le nom par défaut qui prend en charge les scénarios d'héritage.
La bibliothèque cliente lit la valeur URI de l'élément id de entry, qui est la valeur d'identité de l'entité. À moins qu'une valeur MergeOption de NoTracking soit utilisée, la valeur d'identité est utilisée pour suivre l'objet dans DataServiceContext. La valeur d'identité est également utilisée pour garantir que seule une instance d'entité est créée, même lorsqu'une entité est retournée plusieurs fois dans la réponse à la requête.
La bibliothèque cliente lit les propriétés de l'entrée de flux et définit les propriétés correspondantes sur l'objet créé. Lorsqu'un objet qui a la même valeur d'identité existe déjà dans DataServiceContext, les propriétés sont définies selon le paramètre MergeOption de DataServiceContext. La réponse peut contenir des valeurs de propriété qui n'ont pas de propriété correspondante dans le type de client. Dans ce cas, l'action dépend de la valeur de la propriété IgnoreMissingProperties de DataServiceContext. Lorsque cette propriété est définie sur true, la propriété manquante est ignorée. Sinon, une erreur est générée. Les propriétés sont définies comme suit :
Les propriétés scalaires sont définies sur la valeur correspondante dans l'entrée dans le message de réponse.
Les propriétés complexes sont définies sur une nouvelle instance de type complexe, définie avec les propriétés du type complexe de la réponse.
Les propriétés de navigation qui retournent une collection d'entités associées sont définies sur une instance nouvelle ou existante de ICollection<T>, où T est le type d'entité associée. Cette collection est vide à moins que les objets connexes aient été chargés dans DataServiceContext. Pour plus d'informations, consultez Chargement de contenu différé (WCF Data Services).
Notes
Lorsque les classes de données clientes générées prennent en charge la liaison de données, les propriétés de navigation retournent des instances de la classe DataServiceCollection<T> à la place.Pour plus d'informations, consultez Liaison des données aux contrôles (WCF Data Services).
L'événement ReadingEntity est déclenché.
La bibliothèque cliente joint l'objet à DataServiceContext. L'objet n'est pas joint quand MergeOption est NoTracking.