350 messaggi dal 08 febbraio 2009
Salve a tutti.

Supponiamo di avere due classi: Fatture e DettaglioFattura.

Essendo queste classi "legate fra loro", viene a crearsi un riferimento "ciclico". A quanto pare WCF non mi consente di inviare i dati al servizio.

Spiego meglio la questione.

Creiamo una fattura simile alla seguente:


Fattura f = new Fattura();
f.numero = 1;
f.Dettagli = new List<DettaglioFattura>();

DettaglioFattura d = new DettaglioFattura();
d.Descrizione = "prova";

f.Dettagli.Add(d);


Anche se il codice sembra corretto, c'è una anomalia: la variabile d (che è un DettaglioFattura) ha la proprietà "Fattura" che è null.
Infatti abbiamo legato le righe alla fattura, a non il contrario.

Pertanto, riscrivo il codice nel seguente modo:


Fattura f = new Fattura();
f.numero = 1;
f.Dettagli = new List<DettaglioFattura>();

DettaglioFattura d = new DettaglioFattura();
d.Descrizione = "prova";

f.Dettagli.Add(d);

... riga aggiunta ....
d.Fattura = f;



In questo caso, però, se provo a passare la variabile "f" al WCF, questo mi esce con errore perchè c'è un riferimento ciclico.


Qualcuno sa come aggirare il problema?
Beh non fare riferimenti ciclici
Solitamente si descrivono i contratti i modo che il padre hai i figli ma i figli non hanno un riferimento al padre. D'altronde deve serializzare in XML e i riferimenti circolari non sono rappresentabili.
Se invece vuoi tenerti le entità originali, puoi marcare la proprietà che punta al padre con l'attributo IgnoreDataMember così non viene serializzata. Oppure puoi usare questa tecnica
http://www.winfxitalia.com/script/123/Intercettare-Eventi-Serializzatore-WCF.aspx

Ciao

Il mio blog
Homepage
350 messaggi dal 08 febbraio 2009
Grazie della dritta (anche se non capisco la differenza fra IgnoreDataMember o non mettere DataMember).

Il mio problema, però, è un po' più complesso in quanto ci sono situazioni in cui ho bisogno di avere quel legame.


Mi spiego con un esempio.
La mia applicazione ha l'anagrafica "Clienti" e "Aziende", dove ciascun cliente può avere più aziende.

Pertanto la classe Cliente ha la proprietà IList<Azienda> e ciascuna azienda ha la proprietà Cliente.

Quando sono dentro all'anagrafica Clienti (WPF), allora devo avere caricato l'elenco delle Aziende per visualizzarle in un list-view.

Nel resto del programma, però, lavoro utilizzando sempre e solo l'azienda. In tal caso mi serve avere il riferimento al Cliente di cui l'azienda fa parte (per fare dei controlli e per visualizzare delle info a video).

Essendo la classe Azienda sempre la medesima, come faccio a dire:
-) Se sei all'interno di un elenco, non caricare la proprietà Cliente
-) Se sei fuori dall'elenco, allora carica il campo Cliente

L'unica cosa che mi viene in mente è creare due DTO distinti... C'è di meglio?
Ed è per queste esigenze che come ti ho suggerito all'inizio, le classi wcf sono solo un rappresentazione dell'xml che passa. Le tue classi con referenze circolari, supporto al binding ecc dovrebbero essere una cosa a parte, così non hai più questo problema.

Ciao

Il mio blog
Homepage

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.