Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103

    [C#] Entity Framework e refresh dati datagridview

    Ciao a tutti, mi sto imbattendo in questo problema e volevo magari qualche consiglio da qualcuno più esperto di me.

    Tempo fa, diversi anni ormai, ho realizzato un gestionale multi-client il quale si connette ad un db mysql remoto. Principalmente i dati venivano mostrati in controlli datagridview.

    La difficoltà che ho trovato è stata nel aggiornare i dati nel datagridview di tutti i client quando un determinato client faceva una modifica su un record. Visto che il db aveva molti dati, non potevo riselezionare tutta la tabella, ma ho dovuto implementare un piccolo sistema per sapere quali record erano stati modificati.

    Per fare questo ogni volta che un client eseguiva una modifica, insert/update/delete, registravo l'azione in una tabella.

    Periodicamente tutti i client controllavano le modifiche in questa tabella, e eseguivano quelle che non avevano ancora letto, aggiungendo, modificando o eliminando le righe del dataset associato al datagridview.

    La domanda è, visto che mi ha dato non pochi problemi, c'è un modo più semplice di fare ciò tramite entity framework?

    Grazie per gli eventuali consigli o chiarimenti


  2. #2
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    puoi ottenere qualcosa di simile attivando la concorrenza ottimistica e facendo refresh() dopo aver salvato i dati. Qui spiega tutto.

    link

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103
    Ciao grazie per il consiglio, ma forse non ho capito bene una cosa. Ti faccio un esempio pratico:

    Carico gli utenti su datagridview con questo codice:
    codice:
          entity = new dbEntity();
    
           //Set DataSource
           ClientiGrid.DataSource = entity.clienti;
    Poi tramite un altro form aggiungo un nuovo cliente e lo salvo:

    codice:
        clienti c = new clienti();
        c.ragione_sociale = RagioneSocialeText.Text;
        
        entity.clienti.AddObject(c);
    
        entity.SaveChanges();
    Poi aggiorno i dati nel datagridview alla chiusura del form tramire:
    codice:
      //Refresho Datagri
      BindingSource source = new BindingSource();
      source.DataSource = entity.clienti.ToList();
      ClientiGrid.DataSource = source;
    Fin qui tutto ok, anche se ho un dubbio sul refresh dei dati che fatto in questo modo lui si scarichi di nuovo tutta la tabella e non solo le righe aggiunte e modificate.

    Tramite il link che mi hai mandato però non ho capito questa cosa:

    Io ho il programma aperto e visualizzo la lista dei clienti.

    Un altro client inserisce un nuovo cliente, come faccio io ad aggiornare i dati nella mi griglia aggiungendo solo il nuovo record?
    La stessa cosa per update e delete, in ogni caso devo eliminare o aggiornare nella mia griglia solo la riga interessata.

    Non so se sono riuscito a spiegarmi.

    Però nel link che mi hai passato tratta di come gestire conflitti in caso di aggiornamenti se le due sorgenti di dati non coincidono.

    Sono del tutto fuori strada?

    Grazie!!!!


  4. #4
    Utente di HTML.it L'avatar di rsdpzed
    Registrato dal
    Aug 2001
    Messaggi
    764
    Infatti io avevo detto "qualcosa di simile"
    Quello che vuoi tu mi sembra difficile che possa essere gestito da EF.

    A parte questo con EF puoi fare questo (che potrebbe anche essere sufficiente):

    - Carichi la view sul client 1
    - Client 2 Modifica dei dati che in quel momento client 1 sta guardando
    - Non succede nulla tranne per il fatto che client 1 continua a guardare dati vecchi.
    - Ad un certo punto Client 1 (che ha ancora i vecchi dati in grid) fa una modifica e prova a salvare.
    - EF lancia una ConcurrencyException()
    - Tu catturi l'eccezione e puoi:
    1) Aggiornare il context con i dati aggiornati dal DB con Refresh impostato su SourceWin
    2) sempre con refresh() ma questa volta impostato su ClientWin aggiorni il context
    - In entrambi i casi ora il context è aggiornato e puoi richiamare saveChanges.

    La differenza tra i due tipi di refresh sta nel fatto che nel primo caso vince il client che aggiorna per primo (e il secondo si becca magari una messagebox di errore), nel secondo caso vince quello che aggiorna per ultimo. Esistono svariati casi in cui uno di questi due comportamenti ha senso e l'altro no. E viceversa.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2006
    Messaggi
    103
    Ciao, continuo qui la discussione nel caso si ritenga che devo aprirne una nuova lo farò.

    Mettiamo caso che per rilevare le modifiche fatte dagli altri client io uso il sistema che ho descritto nel primo post.
    Questo perchè su tutti i client devo avere i dati più o meno sempre aggiornati, quindi se viene aggiunto un nuovo record o eliminato i client connessi devono poterlo vedere anche se diciamo sono in "standby".

    Utilizzando i dataset pe rvisualizzare i dati in un datagridview, quando trovavo nuovi record semplicemente creavo una nuova DatRow e la aggiungevo al dataset associato al datagridview.

    Nel solito modo procedevo in caso di update e delete.

    Tramite entity framework, ho pensato di aggiungere il nuovo oggetto all'entità della tabella, ma poi non viene visualizzata nel datagrid.


    codice:
     cliente c= new Cliente();
     
     c.nome="Pippo";
     
     en.clienti.AddObject(c);
    A questo punto non riesco a visualizzare il nuovo cliente senza fare il refresh dell'entity.

    Scusate, forse è una domanda banale, ma mi sto avvicinando adesso all'entiy framework.

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.