Domanda WPF Entity Framework Concorrenza

  • lunedì 13 febbraio 2012 11:20
     
     

    Salve a tutti ragazzi nello sviluppo di alcuni miei programmi ho riscontrato una problematica che non ho capito da dove cominciare per risolvere. 

    Vi spiego il problema. 
    Ho creato una semplice applicazione rubrica con un elenco telefonico (è un progetto test per fare delle prove). Per l'approccio ho utilizzato model first e per il database un semplice database Sql Server compact.

    Ora il database risiede sul server e vari utenti possono accedere alla rubrica sia in modifica che il lettura.

    Come faccio ad impostare un qualcosa che mi dica che già un altro utente sta utilizzando quel record in modifica e che quindi io posso solo visualizzarlo?


    C'è qualche cosa che fa direttamente EF oppure devo gestire tutto io manualmente? 

    Grazie per il vostro aiuto. 
    Francesco Valentino

Tutte le risposte

  • lunedì 13 febbraio 2012 12:15
     
     

    ciao

    EF gestisce da solo la concorrenza se vuoi

    basta selezionare una colonna identity o timestamp di una entità in EF e impostare la proprietà concurrencymode = fixed

    http://msdn.microsoft.com/en-us/library/bb738618.aspx


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

  • lunedì 13 febbraio 2012 12:33
     
     

    Prima di tutto ti ringrazione per la tua risposta.

    Ma in questo caso la gestione della concorrenza non avviene nel momento in cui si richiama savechanges?

    Io vorrei fare in modo tale che già all'apertura del record l'utente sia avvisato che un'altro operatore sta effettuando delle modifiche e quindi gli dia solo la possibilità di visualizzare i dati senza poterli modificare. Diciamo un pò come avviene per i documenti word se lo si apre in due il primo lo può modificare il secondo può solo visualizzarlo.

    Francesco Valentino.

  • lunedì 13 febbraio 2012 13:18
    Moderatore
     
     

    Prima di tutto ti ringrazione per la tua risposta.

    Ma in questo caso la gestione della concorrenza non avviene nel momento in cui si richiama savechanges?

    Io vorrei fare in modo tale che già all'apertura del record l'utente sia avvisato che un'altro operatore sta effettuando delle modifiche e quindi gli dia solo la possibilità di visualizzare i dati senza poterli modificare. Diciamo un pò come avviene per i documenti word se lo si apre in due il primo lo può modificare il secondo può solo visualizzarlo.

    Francesco Valentino.


    A mio parere è del tutto normale che la concorrenza venga gestita al SaveChanges, perchè è solo in quel momento che i dati si 'scontrano' nel database dato che prima stanno in memoria. Secondo me devi trovare una strada per notificare ai client che i dati sono stati caricati, ma devi farlo a livello di collection e non in base al concetto di concorrenza per come è presente in EF. Magari tramite eventi o una notifica dal ViewModel se usi WPF.

    Alessandro Del Sole
    Microsoft MVP - Visual Basic: development
    http://community.visual-basic.it/alessandro/

  • lunedì 13 febbraio 2012 13:44
     
     

    Praticamente dovrei creare un sistema che comunica con il client per notificargli che i dati sono stati caricati da un altro utente.

    Solitamente questo come lo si potrebbe fare?

    Un'idea che mi era venuta è che per ogni entita specificare un capo stato così ogni volta che un utente apre la window di modifica di quel record imposta lo stato del record come in modifica e quindi all'apertura da un altro client verifico lo stato e se non è in sola lettura gli consente le modifiche altrimenti lo fa solo visualizzare. Poi all'uscita della window modifica lo stato in libero.

    Potrebbe essere un'idea?

    Però nel caso di un crash di windows o del programma poi lo stato del record non verrebbe riaggiornato a libero e perciò risulterebbe sempre in modifica.

    Avete qualche altro suggerimento da darmi?

    Vi ringrazio per il vostro aiuto.

    Francesco Valentino