16 messaggi dal 21 maggio 2007
Ciao a tutti

Sono ancora qui ad approfittare di voi.

Ho un problema legato alla serializzazione di Entity di EF tramite DataContractSerializer.

In pratica: ho un web service WCF con un metodo che restituisce una lista di istanze di una Entity chiamata Supplier. Il problema è che nel client, quando ricevo queste istanze, le relative EntityReference e EntityCollection non vengono deserializzate correttamente.

Ho provato a fare un metodo di test a mano che serializza e deserializza un istanza di Supplier con DataContractSerializer e tutto funziona correttamente.

Quale potrebbe essere il mio problema?

Grazie in anticipo per l'aiuto!

Matteo
Io sapevo che c'erano delle grane in passato (mi pare che le reference nn fossero (de)serializzate) ma ora dovrebbe essere tutto ok. Io ho appena fatto una prova con Cliente - Fattura - Dettagli, fetchando una fattura by Id con Include del cliente e dei dettagli e mi pare che i dati transitino tutti.

Tu nello specifico che problema hai?
m.
16 messaggi dal 21 maggio 2007
Ciao

Io ho un metodo di business che carica una lista di supplier con Include della loro proprietà Customers, che è una EntityCollection di Customer.
Il mio servizio invoca questo metodo e riceve la lista caricata correttamente con tutti i supplier e relativi customer.
Quando però restituisco la lista dal servizio al mio client, sul client mi ritrovo solo i supplier senza i relativi customer.
Lo stesso problema me lo da anche sulle EntityReference eventualmente incluse.
Per completezza: per scambiare i dati tra servizio e client non uso particolari DTO, ma direttamente le mie entity.

Matteo
Domanda: le tue entity hanno l'attributo DataMember in corrispondenza delle property di relazione?

Inoltre, ovviamente hai la versione finale di EF, quella inclusa nel SP1, vero?

Perchè non provi a ripetere l'esperimento in un progetto semplice?

m.
16 messaggi dal 21 maggio 2007
Le risposte sono si e si.

Non ci avevo pensato: provo a fare un nuovo progetto e a vedere come si comporta.

Matteo
16 messaggi dal 21 maggio 2007
Ciao, sono sempre io!


In effetti, se faccio una prova sul caro vecchio progetto di test con Northwind il tutto funziona correttamente.

Cosa posso aver fatto di così dannoso da non farmi più serializzare le entity corrette?

Beh intanto ora smonto il progetto byte per byte...
16 messaggi dal 21 maggio 2007
Ho scoperto qual'è il problema.

Nella mia classe Objectcontext ho fatto l'override del metodo Dispose, andando ad eseguire un Detach dal context di tutte le entity presenti nello statemanager. Questo l'ho fatto per ovviare al fastidioso problema di ritrovarsi le entity attached ad un ObjectContext che non esiste più.
Domanda: è una buona soluzione?

Il fatto è che se commento il dispose il risultato viene serializzato correttamente. Tutto il resto, però, smette di funzionare (i miei test vengono tutti rossi...)
Ecco.. è una bella grana... dal comportamento di EntityReference e EntityCollection sembra quasi che per serializzarsi correttamente richiedano la presenza di un ObjectContext.

Ora, faccio una considerazione. Mi pare di capire che tu stia gestendo un'architettura distribuita (quindi disconnessa), pertanto mi chiedo: che bisogno hai di mantenere attivo il tracking service? Infatti, disabilitandolo, non hai problemi a fare Attach di entity senza aver fatto un precedente detach, e da qui ti si risolverebbe un po' tutto.

Se invece questa semplificazione non fa al tuo caso, allora credo che l'unica strada sia quella di creare un custom behavior per WCF per iniettare codice custom in fase di serializzazione, quindi creare un object context, fare attach e amen. Non è tanto banale.

Ciao
m.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.