locked
SQLserver relazioni tra babelle in Silverlight RRS feed

  • Domanda

  • Ciao a tutti,

    in un Database SQLserver nel dominio ho creato due tabelle User e Messages con una relazione ID>UserID

    se non creo alcuna relazione, vedo tutti gli elementi delle tabelle, ma con la relazione non mi da nessun elemento da tutte e due le tabelle.

    quasto è il servizio WCF

     public class WCFService : IWCFService 
        {
                   public Users user(int userID)
            {
                using (var ctx = new DBEntities())
                {
                    return (from c in ctx.Users where c.ID == userID select c).SingleOrDefault();
                }
            }
    
        }

    DataContext = e.Result;

    listbox.ItemsSource = e.Result.Messages;

    qualcuno potrebbe darmi qualche suggerimento su come risolvere?

    grazie in anticipo a tutti


    fabio miceli

    venerdì 15 novembre 2013 18:22

Risposte

  • dipende dal tipo di WCF... da quel che mi sembra di capire dal codice postato si, credo che nel tuo caso siano necessarie. In ogni caso, anche se non ci fosse bisogno degli attributi, Lazy Loading è abilitato di default, quindi se non lo hai disabilitato le entità figlio non verranno passate insieme al padre, quindi risulteranno vuote. Per ottenere anche le entità figlio puoi fare in 2 modi :

    1) disabiliti il Lazy Loading dal tuo DBEntities

    OPPURE

    2) carichi la lista con include :

    using (var ctx = new DBEntities())
                {
                    return (from c in ctx.Users.Include(padre=>padre.Messages) where c.ID == userID select c).SingleOrDefault();
                }

    dove Messages è il nome della proprietà figlio che vuoi caricare

    Comunque sei sempre molto vago nelle tue richieste... indica anche il tipo di WCF, come lo hai creato, con cosa ecc.

    • Contrassegnato come risposta Fabio Miceli venerdì 15 novembre 2013 22:54
    venerdì 15 novembre 2013 20:02

Tutte le risposte

  • Ciao fabio,

    le classi relazionate con User hanno gli attributi [DataContract] sulla classe e [DataMember] sulle proprietà pubbliche?


    • Modificato U 235 venerdì 15 novembre 2013 18:51
    venerdì 15 novembre 2013 18:51
  • ciao

    veramente non ho creato le classi di DTO o Partial Class, i metodi all' interno dei WebService vanno diretti alla classe di EDMX....devo necessariamente creare un modello dove trasferire gli elementi del DB che mi intereessano ?


    fabio miceli

    venerdì 15 novembre 2013 19:31
  • dipende dal tipo di WCF... da quel che mi sembra di capire dal codice postato si, credo che nel tuo caso siano necessarie. In ogni caso, anche se non ci fosse bisogno degli attributi, Lazy Loading è abilitato di default, quindi se non lo hai disabilitato le entità figlio non verranno passate insieme al padre, quindi risulteranno vuote. Per ottenere anche le entità figlio puoi fare in 2 modi :

    1) disabiliti il Lazy Loading dal tuo DBEntities

    OPPURE

    2) carichi la lista con include :

    using (var ctx = new DBEntities())
                {
                    return (from c in ctx.Users.Include(padre=>padre.Messages) where c.ID == userID select c).SingleOrDefault();
                }

    dove Messages è il nome della proprietà figlio che vuoi caricare

    Comunque sei sempre molto vago nelle tue richieste... indica anche il tipo di WCF, come lo hai creato, con cosa ecc.

    • Contrassegnato come risposta Fabio Miceli venerdì 15 novembre 2013 22:54
    venerdì 15 novembre 2013 20:02
  • Allora....

    sicuramente io non sono in grado di far funzionare i WCF in modo tale che...a sito pubblicato mi diano gli elementi del DB visualizzati nei vari controlli.

    ho rifatto  un test per l' ennesima volta (con i WCFService) e non ci sono riuscito.

    cosa che riesco invece con WebService, a sito pubblicato mi ritorna tutto.

    purtroppo non ho molto tempo da dedicare a cercare soluzioni e fare test, quindi va bene così !!!!

    scusa se sono vago, cercherò di migliorare !!

    ripeto ho poco tempo,lo faccio solo per hobby/passione (anche se spesso mi rende utile nel mio lavoro) e in quel poco tempo vorrei riuscire a capire e fare bene.

    quindi ritornando....

    visto che sicuramente dovrò fare le implementazione per l'interfaccia di notifica e DataError, come mi consigli di fare ?


    fabio miceli

    venerdì 15 novembre 2013 20:22
  • Fabio, 

    io ti capisco, vorresti già saper fare tutto senza problemi, ma "capire bene" e "poco tempo" sono due cose che non vanno d'accordo... solo spendendo tempo ad imparare bene si impara bene!

    Secondo me la tua maggiore perdita di tempo, a giudicare dai tuoi post e thread vari, sembrerebbe localizzata nei continui cambi di direzione che fai, prima gestisci in un modo, poi alla prima difficoltà cambi direzione, così ti ritrovi con una parte fatta in un modo, l'altra fatta in un altro ecc. la naturale conseguenza è che così ti perdi e ti ritrovi con delle robe incoerenti e confuse, e quando riesci a far andare una cosa di riflesso l'altra (che magari non è adatta allo scopo ma è quella che sei riuscito a far funzionare prima...) non funziona più. Dopo magari per aggiustare la seconda "rompi" la prima... e via dicendo come un cane che si morde la coda.

    Credimi, non sono un bacchettone, lo dico per te... Prima stabilisci cosa vuoi fare, dopo documentati su quali siano le tecnologie/modalità migliori o più comuni per raggiungere il tuo scopo, in seguito prendile una per una e studiale in maniera approfondita prima di applicarle, solo dopo applicale. Una volta applicate incomincia la parte vera della programmazione, mettere in pratica quello che hai progettato in teoria, con test-debugging... test-debugging... test-debugging... test-debugging... test-debugging... ecc...

    Ricorda che è verissimo che la programmazione si può tranquillamente imparare da autodidatta, ma questo non significa che non bisogna studiare o che non sia necessario un metodo di studio... anzi... è molto più dura di un corso universitario perché devi fare tutto da solo senza professori che ti aiutino nel tuo cammino e che ti diano un metodo di studio, e dovrai fare anche gli esami da solo : funziona perfettamente? promosso!, non funziona perfettamente? bocciato, torna a studiare...

    Tornando alla tua domanda (mi chiedi un consiglio), dovresti specificare una volta per tutte alcuni requisiti :

    1) tipo di applicazione. Ok, Silverlight... (magari dovresti anche valutare la versione, ma immaginiamo la 5)

    2) modo di reperire i dati: questo può essere un web service, dataservice, ria service ecc. (alla fine sono tutti dei web services, ma alcuni sono più adatti di altri perché pensati per diversi scopi e realizzati in maniera differente), oppure file locale ecc. 

    3) se c'è un db dietro il servizio devi stabilire quale, SQLServer, SQLCE ecc.

    3a) se usi un ORM (es EF) devi imparare il suo utilizzo, quindi decidere in base ad una buona conoscenza quale metodo utilizzare. Per esempio EF + Code First + RIA Service potrebbe semplificarti la vita se dovrai manipolare le proprietà per mettere ad esempio nel set il DataErrorChange o il PropertyChanged o implementare IEditable o simili ecc. e che dovranno riflettersi nell'eventuale RIA Service.

    3b) dovrai strutturare il codice in modo da raggiungere il tuo scopo. Se è quello di rendere tutto il più dinamico possibile e con meno codice possibile oltre che facilmente riutilizzabile, allora devi studiarti anche reflection, dynamic, devi conoscere molto bene come funzionano le interface di C#, come funziona la condivisione di codice scritto sul server verso Silverlight (ad esempio per creare le regole di validazione personalizzate e condividerle tramite file comune sia al server sia al client) ecc.

    4) dove deve risiedere il db, dove il servizio, e dove il client Silverlight 

    4a) devi imparare a manipolare il config, sia del client sia del server in modo che vai a chiamare gli url corretti.

    poi gli altri quesiti arriveranno andando avanti in base alle tante combinazioni di queste primissime domande... (:D è solo l'inizio)

    Purtroppo se vuoi imparare davvero devi avere pazienza. Noi possiamo solo darti una mano, ma il grosso devi mettercelo tu... Dai su... ho visto che quando ti impegni riesci anche da solo, figurati se ti diamo una mano!!! devi solo inquadrare meglio le cose.

    venerdì 15 novembre 2013 21:30
  • ok...capito grazie...per me la pazienza più grande celavete voi !!! non so come ringraziarti.

    ciò che voglio realizzare è un sito personale, alcune pagine che parlano della mia attività, una sorta di CV multimediale aperto a tutti, un blog dove ogni mio collega/amico può esporre la sua idea le problematiche e condividere immagini documenti progetti ed altro.

    in sintesi il mio scopo è questo.

    Ora...da dove iniziare...?

    poichè sicuramente dovrò fare dei salvataggi di dati, come per esempio la registrazione utente, messaggeria salvataggio documenti immagini e roba varia, se non capisco bene come e dove interfacciarmi con il DB, con quali servizi e con quali metodi, non posso iniziare a scrivere codice inutilmente. (che fin'ora è proprio quello che ho fatto :) )

    Adesso più o meno ho capito come funziona quello che riguarda il collegamento tra il Client/Server/DB

    in pratica avviene tutto tramite WCF(o altro), se non ho capito male qualsiasi cosa che deve arrivare dal client(o viceversa) al server passa attraverso i servizi.


    Se questo passo lo capito bene, vorrei capire un' altra cosa:

    per quello che riguarda le implementazioni di notifiche Error ed altro, si fanno nel Client o nel WCF ?

    cioè...il servizio deve passare i dati al client già implemantati o no ?

    il DB si deve necessariamente creare dal dominio ? non è possibile crearlo da macchina e pubblicarlo assieme al resto?


    fabio miceli

    venerdì 15 novembre 2013 22:23
  • Comunque ti volevo dire che ho aggiunto Include("Messages") e funziona !!!!

    ho creato un modello ho messo gli attributi DataContract e DataMember e fatto il trasferimento dal EDM a DTO nel WebService.... adesso vede sia master che details.

    non sono riuscito a trovare Lazy Loading !! :(


    fabio miceli

    venerdì 15 novembre 2013 22:40
  • Ciao,

    mi fa piacere :) 

    non preoccuparti per il Lazy Loading, lascialo così se no ti carica tutto subito anche se non ti serve.

    sabato 16 novembre 2013 16:50
  • ok...non so come ringraziarti

    alla prossima


    fabio miceli

    sabato 16 novembre 2013 17:52