#111 - Personalizzare la serializzazione delle entità di ADO.NET Data Services
di Marco Leoncini, in Windows Communication Foundation, Entity Framework, 27 marzo 2009
Archiviato in: .NET Framework, .NET Framework 3.0, .NET Framework 3.5, Entity Framework, LINQ, WCF Data Services, Web Service
Utilizzando ADO .NET Data Services si può presentare la necessità di aggiungere alle entità generate da Visual Studio, alcune proprietà che non trovano nessuna corrispondenza nel database che si sta mappando, ne si trovano sull'entità presenti sul server. Queste proprietà sono esclusivamente a uso e consumo del client, sia esso un'applicazione WPF, Silvelight o asp.net.
Il servizio in esempio espone una collezione di entità Games, con tre proprietà GamesID, Name e description, sul Client, nel nostro caso una semplice applicazione asp.net, per motivi progettuali è necessaria una nuova proprietà chiamata Score.
Sfruttando che le classi generate dal Visual Studio sono contrassegnate come Partial, aggiungere la proprietà Score non è certo un problema. Discorso ben diverso se si tenta di persistere l'entità, inesorabilmente riceveremo il seguente errore:
Error processing request stream. The property name 'Score' specified for type 'MyGamesDBModel.Games' is not valid
Allo stato attuale l'unico modo per risolvere il problema è intervenire nel processo di serializzazione in formato Atom dell'entità. Creiamo quindi un event handler per l'evento WritingEntity da agganciare sfruttando il partial method OnContextCreated() del la classe proxy del servizio.
partial void OnContextCreated() { this.WritingEntity += new System.EventHandler<System.Data.Services.Client.ReadingWritingEntityEventArgs>(MyGamesDBEntities_WritingEntity); }
Nel'event handler sfruttando Linq To Xml recuperiamo l'elemento da rimuovere
void MyGamesDBEntities_WritingEntity(object sender, System.Data.Services.Client.ReadingWritingEntityEventArgs e) { XName _xnEntityProperties = XName.Get("properties", e.Data.GetNamespaceOfPrefix("m").NamespaceName); XElement _xePayload = e.Data.Descendants().Where<XElement>(xe => xe.Name == _xnEntityProperties).First<XElement>(); //indivudio la proprietà da rimuovere XName _xnProperty = XName.Get("Score", e.Data.GetNamespaceOfPrefix("d").NamespaceName); //indivudo l'elemento XElement _xeRemoveThisProperty = _xePayload.Descendants().Where<XElement>(xe => xe.Name == _xnProperty).First<XElement>(); //e lo rimuovo _xeRemoveThisProperty.Remove(); }
Così facendo al server arriva l'entità serializzata priva della proprietà definita sul Client.
Attenzione: Questo script contiene un allegato.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
-
Le problematiche più comuni di un'architettura M-V-VM con WPF
-
La piattaforma Microsoft per il cloud computing: Windows Azure
-
#1007 - Personalizzare il template di edit in ASP.NET Dynamic Data Controls
-
#151 - Disabilitare Aero programmaticamente per incrementare le performance di WPF
-
Enumeratori: flags and extensions
-
#164 - Eseguire una stored procedure tramite l'Entity Client di Entity Framework
-
Open Data Protocol e WCF Data Services
-
Real Code Conference 4: Entity Framework 4.0
-
#198 - Recuperare le informazioni custom inserite nell'Entity Data Model di Entity Framework
-
Real Code Conference 4 il 25 maggio a Firenze: ASP.NET 4.0, servizi web 2.0, Silverlight 4.0 e Windows Phone 7
-
#161 - Clonare e manipolare Message in WCF
-
#175 - Visualizzare gli errori dei WCF Data Services

Commenti
mi piace
non mi piace
Facebook
Twitter










