Programmering

Hvordan håndtere samtidighetskonflikter i Entity Framework

Samtidig håndtering kan brukes til å opprettholde dataintegritet og datakonsistens når flere brukere får tilgang til samme ressurs samtidig. Samtidige brudd kan oppstå når du har gjensidig avhengige transaksjoner, dvs. transaksjoner som er avhengige av hverandre og prøver å få tilgang til samme ressurs.

Håndtering av samtidighetskonflikter i Entity Framework

La oss nå forstå hvordan hver av disse strategiene fungerer i Entity Framework. I den pessimistiske samtidigheten, når en bestemt post oppdateres, vil alle andre samtidige oppdateringer på samme post bli satt på vent til den nåværende operasjonen er fullført og kontrollen blir gitt tilbake slik at andre samtidige operasjoner kan fortsette. I den optimistiske samtidighetsmodusen, "vinner" den siste lagrede posten. I denne modusen antas det at ressurskonflikter på grunn av samtidig tilgang til en delt ressurs er usannsynlige, men ikke umulige.

Forresten gir Entity Framework støtte for optimistisk samtidighet som standard. Entity Framework gir ikke støtte for pessimistisk samtidighet utenom boksen. La oss nå forstå hvordan Entity Framework løser samtidighetskonflikter når vi jobber i den optimistiske samtidigheten (standardmodus).

Når du arbeider med optimistisk samtidighetshåndteringsmodus, vil du vanligvis lagre data i databasen din, forutsatt at dataene ikke har endret seg siden de ble lastet inn i minnet. Merk at når du prøver å lagre endringer i databasen ved hjelp av SaveChanges-metoden i din datakontekstforekomst, blir et DbUpdateConcurrencyException kastet. La oss nå forstå hvordan vi kan fikse dette.

For å se etter brudd på samtidighet kan du inkludere et felt i enhetsklassen din og merke det ved hjelp av tidsstempelattributtet. Se enhetsklassen gitt nedenfor.

offentlig klasse Forfatter

   {

offentlig Int32 Id {get; sett; }

offentlig streng Fornavn {get; sett; }

offentlig streng Etternavn {get; sett; }

public string Address {get; sett; }

[Tidsstempel]

offentlig byte [] RowVersion {get; sett; }

   }

Nå støtter Entity Framework to samtidige moduser: Ingen og Fast. Mens førstnevnte innebærer at ingen samtidighetskontroller vil bli utført når du oppdaterer enheten, antyder sistnevnte at den opprinnelige verdien av eiendommen vil bli vurdert når du utfører WHERE-klausuler på det tidspunktet når oppdateringer eller slettinger av data blir gjort. Hvis du har en eiendom som er merket ved hjelp av tidsstempel, blir samtidighetsmodusen betraktet som løst, noe som igjen innebærer at den opprinnelige verdien av eiendommen ville bli vurdert i WHERE-klausulen om eventuelle oppdateringer eller slettinger av data for den aktuelle enheten.

For å løse optimistiske samtidighetskonflikter, kan du dra nytte av Reload-metoden for å oppdatere gjeldende verdier i enheten din som ligger i minnet med de siste verdiene i databasen. Når du har lastet de oppdaterte dataene på nytt, kan du prøve å fortsette enheten din i databasen. Følgende kodebit illustrerer hvordan dette kan oppnås.

bruker (var dbContext = new IDBDataContext ())

{

Forfatterforfatter = dbContext.Authors.Find (12);

author.Address = "Hyderabad, Telengana, INDIA";

prøve

         {

dbContext.SaveChanges ();

         }

fangst (DbUpdateConcurrencyException ex)

         {

ex.Entries.Single (). Last på nytt ();

dbContext.SaveChanges ();

         }

}

Merk at du kan utnytte Entries-metoden i DbUpdateConcurrencyException-forekomsten for å hente listen over DbEntityEntry-forekomster som tilsvarer enhetene som ikke kunne oppdateres når en SaveChanges-metode ble kalt for å vedvare enhetene til databasen.

Nå kalles tilnærmingen vi nettopp diskuterte ofte "lagrede gevinster" eller "databasevinnere" siden dataene i enheten er overskrevet av dataene som er tilgjengelige i databasen. Du kan også følge en annen tilnærming kalt "klient vinner". I denne strategien blir dataene fra databasen hentet for å fylle ut enheten. I hovedsak er dataene hentet fra den underliggende databasen satt som de opprinnelige verdiene for enheten. Følgende kodebit illustrerer hvordan dette kan oppnås.

prøve

{

dbContext.SaveChanges ();

}

fangst (DbUpdateConcurrencyException ex)

{

var data = eks.Entries.Single ();

data.OriginalValues.SetValues ​​(data.GetDatabaseValues ​​());

}

Du kan også sjekke om enheten du prøver å oppdatere allerede er slettet av en annen bruker, eller allerede er oppdatert av en annen bruker. Følgende kodebit illustrerer hvordan du kan gjøre dette.

fangst (DbUpdateConcurrencyException ex)

{

var entity = ex.Entries.Single (). GetDatabaseValues ​​();

hvis (enhet == null)

   {

Console.WriteLine ("Enheten som oppdateres er allerede slettet av en annen bruker ...");

   }

ellers

   {

Console.WriteLine ("Enheten som oppdateres er allerede oppdatert av en annen bruker ...");

   }

}

Hvis databasetabellen ikke har en tidsstempelkolonne eller radversjon, kan du dra nytte av attributtet ConcurrencyCheck for å oppdage samtidighetskonflikter når du bruker Entity Framework. Slik bruker du denne eiendommen.

[Tabell ("Forfattere"]

offentlig klasse Forfatter

{

offentlig forfatter () {}

[Nøkkel]

offentlig int Id {get; sett; }

[ConcurrencyCheck]

offentlig streng Fornavn {get; sett; }

offentlig streng Etternavn {get; sett; }

public string Address {get; sett; }

}

Når du gjør dette, vil SQL Server automatisk inkludere AuthorName når du utfører oppdateringer eller sletter uttalelser i databasen.

$config[zx-auto] not found$config[zx-overlay] not found