Unanswered WCF DataServices - L'add di una entity ritorna l'entity

  • domenica 5 febbraio 2012 18:10
     
      Contiene codice

    Ciao a tutti,

    continuo a piccoli passi con l'uso di un dataservice con EF 4.1 CodeFirst.

    Oggi sto guardando con Fiddler cosa succede "sotto" e c'è una cosa che non capisco.

    Ho una Entity di test Table(Tavolo) e ne faccio un add semplice

                var DB = new Helper().CreateContext();
    
                var T = new DS.Table();
                T.ID = Guid.NewGuid();
                T.Giudizio = "Bello";
                T.NumeroPiedi = 12;
    
                DB.AddToTables(T);
                DB.SaveChanges();
    
    

    tutto funziona regolarmente, però se guardo su Fiddler, nella richiesta c'è una Post con l'entity da salvare, ma nella risposta, oltre ad altri dettagli, c'è tuta l'entity che ho passato per il salvataggio. Praticamente mi è tornata indietro tutta l'entity.

    E' normale questo comportamento oppure si può evitare?

    In questo modo, non si genera tantto traffico inutile?

    Ciao e grazie

     

Tutte le risposte

  • domenica 5 febbraio 2012 19:07
     
     

    ciao

    è normale perchè l'entità va aggiornata di possibili calcoli avuti sul server


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • domenica 5 febbraio 2012 19:41
     
     

    ciao

    è normale perchè l'entità va aggiornata di possibili calcoli avuti sul server


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     


    Ciao, grazie per la tua continua disponibilità.

    Per capire il senso di questo comportamento, potresti farmi un esempio su cosa intendi con "possibili calcoli avuti sul server"?, quello che passo per l'Add, lo vedo come un "DTO" (che  rispecchia l'entity che sta sul server)

    Ciao

  • domenica 5 febbraio 2012 19:42
     
     

    ciao

    di niente :)

     

    un esempio tipico è l'ID autogenerato che appunto è generato dal DB e non da EF


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • domenica 5 febbraio 2012 19:52
     
     

    ciao

    di niente :)

     

    un esempio tipico è l'ID autogenerato che appunto è generato dal DB e non da EF


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

     

    Bhe, pero per recuperare un ID autoincrementale, viene fatta viaggiare l'intera entity sulla rete?

    Adesso non ho modo di verificare(sul mio PC ho solo sql Express), ma EF in questa circostanza, per recuperare l'ID autogenerato fa una query con su tutta l'entity?

     

    ciao

     

     

  • domenica 5 febbraio 2012 19:54
     
     

    bè, avere un aggiornamento dell'entità non significa leggere l'ID

    come farebbe EF a sapere se hai trigger sul DB per modificare i dati? etc, etc, etc?!?!?

     

    EF si limita giustamente a darti un entità correttamente materializzata dal DB


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • domenica 5 febbraio 2012 19:58
     
     

    bè, avere un aggiornamento dell'entità non significa leggere l'ID

    come farebbe EF a sapere se hai trigger sul DB per modificare i dati? etc, etc, etc?!?!?

     

    EF si limita giustamente a darti un entità correttamente materializzata dal DB


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     


    Si certo, non ci avevo pensato, però EF qando fai l'Add di una entity, non rilegge l'entity dal DB per controllare se ci sono state modifiche no? Il comportamento è diverso

     


    • Modificato G Luca domenica 5 febbraio 2012 19:59
    •  
  • domenica 5 febbraio 2012 20:03
     
     

    per l'AddNew non essitono problemi di concorrenza

    per gli update si!

    nel caso si voglia, EF può gestirli impostando nell'entità che vogliamo una proprietà con la sottoproprietà ConcorrencyMode = Fixed

    a quel punto EF solleverà 1 eccezione in caso di modifiche multiple impedendo i casini

     

    http://blogs.msdn.com/b/rickandy/archive/2011/02/17/handling-optimistic-concurrency-exception-with-ef-and-mvc-3.aspx


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • domenica 5 febbraio 2012 20:08
     
     

    per l'AddNew non essitono problemi di concorrenza

    per gli update si!

    nel caso si voglia, EF può gestirli impostando nell'entità che vogliamo una proprietà con la sottoproprietà ConcorrencyMode = Fixed

    a quel punto EF solleverà 1 eccezione in caso di modifiche multiple impedendo i casini

     

    http://blogs.msdn.com/b/rickandy/archive/2011/02/17/handling-optimistic-concurrency-exception-with-ef-and-mvc-3.aspx


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     


    ciao,

    non stavo parlando di concorrenza e di aggiornamenti, ma di un Add, mi sembra "pesante" che l'entity ritorni indietro intera, cosa che EF non fa non rileggendo l'entity dal DB dopo un Add.

     

  • domenica 5 febbraio 2012 20:10
     
     

    ciao

     

    compreso male :)

     

    il pattern del DTO non prevede il non chiamare per ridurre la banda, ma tornarti tutto il necessario così da evitare un numero maggiore di chiamate

    riassumendo: spesso costa di più fare 2 chiamate (l'add, e poi il refresh quando ti servirà, perchè ti servirà x forza visto che c'è sempre qualche proprietà da aggiornare) che farne una sola con un po di xml in più

     

     


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • domenica 5 febbraio 2012 20:26
     
     

    ciao

     

    compreso male :)

     

    il pattern del DTO non prevede il non chiamare per ridurre la banda, ma tornarti tutto il necessario così da evitare un numero maggiore di chiamate

    riassumendo: spesso costa di più fare 2 chiamate (l'add, e poi il refresh quando ti servirà, perchè ti servirà x forza visto che c'è sempre qualche proprietà da aggiornare) che farne una sola con un po di xml in più

     

     


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
    E' difficile prevedere con certezza che C'è sempre qualche proprietà da aggiornare, e imporlo come vincolo, a me verrebbe facile immaginare che è spesso il contrario, a maggior ragione usando i GUID al posto degli auto incrementali. Inoltre al crescere della dimensione della entity ha sempre più incidenza. WCF di suo ha il concetto di oneway per risparmiarsi anche una semplice risposta senza corpo mentre i Dataservices restituiscono tutta l'entity perchè potrebbe servire, mi sembra poco efficiente
  • domenica 5 febbraio 2012 20:28
     
     

    il DTO è un pattern più che consolidato

    i datasevices sono basati sul protocollo OData

    se l'insieme non ti piace, usa pure WCF standard

    ma comunque lavorare senza response è pericoloso... vale solo per scenari asincroni in cui comunque un ack su un altro canale è sempre bene avere, fosse pure per sapere che non c'è stata 1 eccezione


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • domenica 5 febbraio 2012 20:37
     
     

    il DTO è un pattern più che consolidato

    i datasevices sono basati sul protocollo OData

    se l'insieme non ti piace, usa pure WCF standard

    ma comunque lavorare senza response è pericoloso... vale solo per scenari asincroni in cui comunque un ack su un altro canale è sempre bene avere, fosse pure per sapere che non c'è stata 1 eccezione


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     


    Forse mi sono spiegato male, non vole dire che il oneway è il modo migliore di pensare le cose, assolutamente no. Volevo solo dire che WCF si è posto il problema e ha dato degli strumenti allo sviluppatore per decidere la strategia migliore. Sarebbe bello se anche i Dataservices offrissero questi strumenti.

    Si, potrei usare direttamente WCF, ma con i dataservices si risparmiano kg e kg di codice e si evitano continue versioni del server. Come strumento un DS è meraviglioso, solo che in certecose un po ci rimani male di non avere modo di intervenire(IMHO) .

    Ciao

  • lunedì 6 febbraio 2012 00:25
     
     

    ciao

    credo tu stia facendo 1 assunto sbagliato :)

    mi spiego: WCF è un framework, DataServices è un Servizio già funzionante secondo lo standard OData

    è ovvio che WCF ti da ogni possibilità, ma non scrive niente per te

    DataServices invece sono un servizio già funzionante, e dovendo coprire ogni necessità di un servizio  DaaS (data-as-a-service) si sono posti tutti i problemi del caso nel farlo (o dei vari casi) che sia o non perfetto per te questo è parte del motivo da parte tua di scegliere di usarlo oppure no

    ma non è una mancanza della tecnologia

     

    spero di essermi spiegato, altrimenti chiedi pure ulteriori spiegazioni

    a presto

     


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • lunedì 6 febbraio 2012 07:44
     
     

    Ciao G Luca,

    You wrote on 05/02/2012 :

    E' difficile prevedere con certezza che C'è sempre qualche proprietà da aggiornare, e imporlo come vincolo, a me verrebbe facile immaginare che è spesso il contrario, a maggior ragione usando i GUID al posto degli auto incrementali. Inoltre al crescere della dimensione della entity ha sempre più incidenza. WCF di suo ha il concetto di oneway per risparmiarsi anche una semplice risposta senza corpo mentre i Dataservices restituiscono tutta l'entity perchè potrebbe servire, mi sembra poco efficiente

    sono complessivamente d'accordo con te, il problema è inquadrare perché esistono i WCF DataService (come il perché esistono i Ria Services).

    Sono tutte tecnologie che ricadono sotto il cappello di RAD e come tali hanno lo scopo di semplificarti al massimo la vita imponendoti però il loro modo di vedere le cose, che giustamente in certi scenari può anche essere profondamente sbagliato.

    Il problema vero è che queste tecnologie cercano di fare una cosa sbagliatissima in termini SOA: "nascondere" WCF al fine di eliminare un ordine di complessità; il problema è che questo è evidentemente contrario ad un dei tenet di SOA: "service boundaries are explicit".

    .m


    --
    blog @ //milestone.topics.it
  • lunedì 6 febbraio 2012 13:14
     
     

    Ciao G Luca,

    You wrote on 05/02/2012 :

    E' difficile prevedere con certezza che C'è sempre qualche proprietà da aggiornare, e imporlo come vincolo, a me verrebbe facile immaginare che è spesso il contrario, a maggior ragione usando i GUID al posto degli auto incrementali. Inoltre al crescere della dimensione della entity ha sempre più incidenza. WCF di suo ha il concetto di oneway per risparmiarsi anche una semplice risposta senza corpo mentre i Dataservices restituiscono tutta l'entity perchè potrebbe servire, mi sembra poco efficiente

    sono complessivamente d'accordo con te, il problema è inquadrare perché esistono i WCF DataService (come il perché esistono i Ria Services).

    Sono tutte tecnologie che ricadono sotto il cappello di RAD e come tali hanno lo scopo di semplificarti al massimo la vita imponendoti però il loro modo di vedere le cose, che giustamente in certi scenari può anche essere profondamente sbagliato.

    Il problema vero è che queste tecnologie cercano di fare una cosa sbagliatissima in termini SOA: "nascondere" WCF al fine di eliminare un ordine di complessità; il problema è che questo è evidentemente contrario ad un dei tenet di SOA: "service boundaries are explicit".

    .m


    --
    blog @ //milestone.topics.it


    ciao Mauro

    daccordissimo con te


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
  • lunedì 6 febbraio 2012 14:05
     
     

    ciao

    credo tu stia facendo 1 assunto sbagliato :)

    mi spiego: WCF è un framework, DataServices è un Servizio già funzionante secondo lo standard OData

    è ovvio che WCF ti da ogni possibilità, ma non scrive niente per te

    DataServices invece sono un servizio già funzionante, e dovendo coprire ogni necessità di un servizio  DaaS (data-as-a-service) si sono posti tutti i problemi del caso nel farlo (o dei vari casi) che sia o non perfetto per te questo è parte del motivo da parte tua di scegliere di usarlo oppure no

    ma non è una mancanza della tecnologia

    Non li sto mettendo sullo stesso piano, stavo solo rispondendo al tuo

    "se l'insieme non ti piace, usa pure WCF standard"

    Non dico che DS non sia un buon prodotto, è solo che secondo me sono tutti punti migliorabili. Anche EF all'inizio andava abbastanza stretto, ma con le versioni successive ha sempre dato più possibilità di intervenire. Spero solo che i DS seguano lo stesso tipo di percorso, e il discuterlo sui forum mi sembra comunque un piccolo contributo.

     

    spero di essermi spiegato, altrimenti chiedi pure ulteriori spiegazioni

    a presto

     


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
    non mancherò di certo :)
  • lunedì 6 febbraio 2012 14:10
     
     

    Ciao G Luca,

    You wrote on 05/02/2012 :

    E' difficile prevedere con certezza che C'è sempre qualche proprietà da aggiornare, e imporlo come vincolo, a me verrebbe facile immaginare che è spesso il contrario, a maggior ragione usando i GUID al posto degli auto incrementali. Inoltre al crescere della dimensione della entity ha sempre più incidenza. WCF di suo ha il concetto di oneway per risparmiarsi anche una semplice risposta senza corpo mentre i Dataservices restituiscono tutta l'entity perchè potrebbe servire, mi sembra poco efficiente

    sono complessivamente d'accordo con te, il problema è inquadrare perché esistono i WCF DataService (come il perché esistono i Ria Services).

    Sono tutte tecnologie che ricadono sotto il cappello di RAD e come tali hanno lo scopo di semplificarti al massimo la vita imponendoti però il loro modo di vedere le cose, che giustamente in certi scenari può anche essere profondamente sbagliato.

    Si, mi sto facendo un po le ossa. Sono daccordo con te, solo che le tecnologie RAD danno spesso comportamenti di default con la possibilità di intervenire per modificarli. Spero che DS dia sempre più possibilità di questo tipo, perchè come prodotto è davvero bello.

    Il problema vero è che queste tecnologie cercano di fare una cosa sbagliatissima in termini SOA: "nascondere" WCF al fine di eliminare un ordine di complessità; il problema è che questo è evidentemente contrario ad un dei tenet di SOA: "service boundaries are explicit".

    .m



    Daccordissimo
  • lunedì 6 febbraio 2012 15:00
     
     

    ciao

    credo tu stia facendo 1 assunto sbagliato :)

    mi spiego: WCF è un framework, DataServices è un Servizio già funzionante secondo lo standard OData

    è ovvio che WCF ti da ogni possibilità, ma non scrive niente per te

    DataServices invece sono un servizio già funzionante, e dovendo coprire ogni necessità di un servizio  DaaS (data-as-a-service) si sono posti tutti i problemi del caso nel farlo (o dei vari casi) che sia o non perfetto per te questo è parte del motivo da parte tua di scegliere di usarlo oppure no

    ma non è una mancanza della tecnologia

    Non li sto mettendo sullo stesso piano, stavo solo rispondendo al tuo

    "se l'insieme non ti piace, usa pure WCF standard"

    Non dico che DS non sia un buon prodotto, è solo che secondo me sono tutti punti migliorabili. Anche EF all'inizio andava abbastanza stretto, ma con le versioni successive ha sempre dato più possibilità di intervenire. Spero solo che i DS seguano lo stesso tipo di percorso, e il discuterlo sui forum mi sembra comunque un piccolo contributo.

     

    spero di essermi spiegato, altrimenti chiedi pure ulteriori spiegazioni

    a presto

     


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     
    non mancherò di certo :)


    ciao

     

    se vuoi puoi dare 1 occhio al blog del team di WCFDS

    http://blogs.msdn.com/b/astoriateam/default.aspx?wa=wsignin1.0

    se non erro, da qualche parte c'è 1 link ad una pagina dove raccolgono le richieste degli utenti :)

     

    a presto

     


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy