Programiranje

Kako obravnavati konflikte sočasnosti v Entity Framework

Upravljanje sočasnosti se lahko uporablja za ohranjanje celovitosti in doslednosti podatkov, kadar več uporabnikov hkrati dostopa do istega vira. Kršitve sočasnosti se lahko pojavijo, če imate medsebojno odvisne transakcije, tj. Transakcije, ki so medsebojno odvisne in poskušate dostopati do istega vira.

Obravnavanje hkratnih konfliktov v Entity Framework

Zdaj pa razumimo, kako vsaka od teh strategij deluje v Entity Framework. V pesimističnem sočasju bodo pri posodabljanju določenega zapisa vse druge sočasne posodobitve istega zapisa zadržane, dokler se trenutna operacija ne konča in se nadzor ne odpove nazaj, da se lahko nadaljujejo druge sočasne operacije. V optimističnem sočasnem načinu zadnji shranjeni zapis "zmaga". V tem načinu se domneva, da so konflikti virov zaradi sočasnih dostopov do vira v skupni rabi malo verjetni, vendar ne nemogoče.

Mimogrede, Entity Framework privzeto podpira optimistično sočasnost. Entity Framework ne nudi podpore za pesimistično sočasnost. Zdaj pa razumimo, kako Entity Framework razreši konflikte sočasnosti pri delu v optimistični sočasnosti (privzeti način).

Pri delu z optimističnim načinom sočasne obdelave podatkov običajno želite shraniti podatke v bazo podatkov, ob predpostavki, da se podatki niso spremenili, odkar so bili naloženi v pomnilnik. Upoštevajte, da bo pri poskusu shranjevanja sprememb v bazo podatkov z uporabo metode SaveChanges na primerku konteksta podatkov vržen DbUpdateConcurrencyException. Zdaj pa razumimo, kako lahko to popravimo.

Če želite preveriti kršitev sočasnosti, lahko v razred entitete vključite polje in ga označite z atributom Timestamp. Glejte spodaj navedeni razred entitet.

javni razred Avtor

   {

javni Int32 Id {get; set; }

javni niz FirstName {get; set; }

javni niz LastName {get; set; }

javni niz Naslov {get; set; }

[Časovni žig]

javni bajt [] RowVersion {get; set; }

   }

Zdaj Entity Framework podpira dva načina sočasnosti: None in Fixed. Medtem ko prvo pomeni, da pri posodabljanju entitete ne bi bilo mogoče izvajati preverjanja sočasnosti, slednje pomeni, da se bo pri izvajanju klavzul WHERE upoštevala prvotna vrednost lastnosti v času, ko bodo opravljene posodobitve ali brisanja podatkov. Če imate lastnost, ki je označena s časovnim žigom, se način sočasnosti šteje za nespremenljiv, kar pa pomeni, da bi bila prvotna vrednost lastnosti upoštevana v klavzuli WHERE pri posodobitvah ali brisanju podatkov za to določeno entiteto.

Za razrešitev optimističnih sočasnih konfliktov lahko izkoristite metodo Ponovno naloži za posodobitev trenutnih vrednosti v entiteti, ki se nahajajo v pomnilniku, z nedavnimi vrednostmi v bazi podatkov. Po ponovnem nalaganju s posodobljenimi podatki lahko svojo entiteto znova poskusite ohraniti v zbirki podatkov. Naslednji delček kode prikazuje, kako je to mogoče doseči.

z uporabo (var dbContext = new IDBDataContext ())

{

Avtor avtor = dbContext.Authors.Find (12);

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

poskusite

         {

dbContext.SaveChanges ();

         }

catch (DbUpdateConcurrencyException ex)

         {

ex.Entries.Single (). Reload ();

dbContext.SaveChanges ();

         }

}

Upoštevajte, da lahko izkoristite metodo Entries v primerku DbUpdateConcurrencyException, da pridobite seznam primerkov DbEntityEntry, ki ustrezajo entitetam, ki jih ni bilo mogoče posodobiti, ko je bila metoda SaveChanges poklicana, da entitete vztraja v bazi podatkov.

Zdaj se pristop, o katerem smo pravkar razpravljali, pogosto imenuje "shranjeni zmagi" ali "zmage v zbirki podatkov", saj podatke v entiteti prepišejo podatki, ki so na voljo v bazi podatkov. Uporabite lahko tudi drug pristop, imenovan "zmage strank". V tej strategiji se pridobijo podatki iz baze podatkov za zapolnitev entitete. Podatki, pridobljeni iz osnovne baze podatkov, so v bistvu nastavljeni kot izvirne vrednosti za entiteto. Naslednji delček kode prikazuje, kako je to mogoče doseči.

poskusite

{

dbContext.SaveChanges ();

}

catch (DbUpdateConcurrencyException ex)

{

var podatki = ex.Entries.Single ();

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

}

Prav tako lahko preverite, ali je entiteto, ki jo poskušate posodobiti, že izbrisal drug uporabnik ali jo je že posodobil drug uporabnik. Naslednji delček kode prikazuje, kako to lahko storite.

catch (DbUpdateConcurrencyException ex)

{

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

če (entiteta == null)

   {

Console.WriteLine ("Subjekt, ki se posodablja, je že izbrisal drug uporabnik ...");

   }

drugače

   {

Console.WriteLine ("Subjekt, ki se posodablja, je že posodobil drug uporabnik ...");

   }

}

Če tabela baze podatkov nima stolpca s časovnim žigom ali različice vrstice, lahko izkoristite atribut ConcurrencyCheck za odkrivanje konfliktov sočasnosti pri uporabi Entity Framework. Tukaj je opisano, kako se ta lastnost uporablja.

[Tabela ("Avtorji"]

javni razred Avtor

{

javni avtor () {}

[Ključ]

public int Id {get; set; }

[ConcurrencyCheck]

javni niz FirstName {get; set; }

javni niz LastName {get; set; }

javni niz Naslov {get; set; }

}

Pri tem bi SQL Server samodejno vključil AuthorName pri izvajanju stavkov za posodobitev ali brisanje v zbirki podatkov.

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