posts - 315, comments - 268, trackbacks - 15

My Links

News

View Pietro Libro's profile on LinkedIn

DomusDotNet
   DomusDotNet

Pietro Libro

Tag Cloud

Article Categories

Archives

Post Categories

Blogs amici

Links

EF CTP5: Episode IV (Concurrency)

Prendendo sempre come riferimento il database e gli esempi creati nei precedenti episodi, vediamo due possibili strategie per la gestione della concorrenza (ottimistica) in EF CTP5: Store Wins e Client Wins.

Store Wins

using (Db db = new Db())
{
    Developer developer = (from d in db.Developers select d).FirstOrDefault();

    ////Modifica del cognome
    developer.Surname = "Cognome";

    ////In un altro punto dell’applicazione il cognome viene cambiato in “Libro”  
    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        ////Ricarica i dati dal database.
        ex.GetEntry(db).Reload();
        ////A meno di un merge o scelte dell’utente, sul database viene persistito “Libro”.
        db.SaveChanges();

    }
}

In questo caso recuperiamo la prima entità Developer presente nel database e modifichiamo il valore della proprietà Surname. Supponendo che qualcuno esegua  la persistenza dei dati (ovvero cambi il valore del campo cognome della tabella di riferimento) prima del “nostro” SaveChanges(), quando cerchiamo di persistere le modifiche da noi apportate viene sollevata un’eccezione  DbUpdateConcurrencyException. Nel caso di una strategia Store Wins recuperiamo i dati (aggiornati) nel database tramite Reload() ed eseguiamo il SaveChanges() che dovrebbe andare a buon fine, tranne se nel frattempo siano state apportate ulteriori modifiche ai dati su cui stiamo agendo. A tal proposito sarebbe opportuno eseguire un merge “automatico” dei dati o meglio visualizzare i cambianti all’utente che quindi potrà scegliere di cambiare\sovrascrivere i dati o annullare le operazioni.

Client Wins

using (Db db = new Db())
{
    Developer developer = (from d in db.Developers select d).FirstOrDefault();

    Assert.IsNotNull(developer);

    ////Modifica del cognome
    Developer.Surname = "Cognome";

    ////In un altro punto dell’applicazione il cognome viene cambiato in “Libro”
    try
    {
        db.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        DbEntityEntry developer = ex.GetEntry(db);
         ////Settiamo i valori “Original” delle proprietà con i valori presenti nella base di dati
         ////Questo non crea problemi di concorrenza (o almeno non dovrebbe) al prossimo SaveChanges. 
        developer.OriginalValues.SetValues(customer.GetDatabaseValues());

        db.SaveChanges();

    }
}

Nel secondo caso, in caso di eccezione dovuta alla gestione della concorrenza ottimistica, i valori “Currents” della proprietà dell’entità Developer che stiamo modificando sono settati con i valori correntemente persistiti nella base di dati, in questo modo, a meno di ulteriori modifiche sul database, quando richiamiamo SaveChanges() riusciamo a persistere le nostre modifiche. Anche in questo caso potrebbe essere scelta una politica di decisione che rende l’utente responsabile delle operazioni da effettuare.

Per indicare ad Entity Framework quali sono le proprietà che entrano in gioco durante la gestione della concorrenza, utilizziamo l’attributo:

[ConcurrencyCheck]
[...]
public virtual string Surname
 

Print | posted on domenica 13 febbraio 2011 23:14 | Filed Under [ .Net Framework 4.0 ]

Feedback

Gravatar

# re: EF CTP5: Episode IV (Concurrency)

Ho apprezzato molto questa serie, molto curata e precisa, un ottimo punto di riferimento per chi, come me, si sta documentando su EF.
14/02/2011 01:19 | Riccardo
Gravatar

# re: EF CTP5: Episode IV (Concurrency)

@Riccardo
Grazie, penso di completare con un altro paio di post.
14/02/2011 10:08 | Pietro L.
Gravatar

# re: EF CTP5: Episode IV (Concurrency)

Ottimo!
14/02/2011 12:22 | Max
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET