Ohjelmointi

Kuinka käsitellä samanaikaisuuskonflikteja Entity Frameworkissa

Samanaikaisuuden käsittelyä voidaan käyttää tietojen eheyden ja yhdenmukaisuuden ylläpitämiseen, kun useat käyttäjät käyttävät samaa resurssia samanaikaisesti. Samanaikaisuusrikkomuksia voi esiintyä, kun sinulla on keskenään riippuvaisia ​​tapahtumia, ts. Liiketoimia, jotka ovat riippuvaisia ​​toisistaan ​​ja yrittävät käyttää samaa resurssia.

Samanaikaisuuskonfliktien käsittely entiteettikehyksessä

Ymmärretään nyt, kuinka kukin näistä strategioista toimii Entity Frameworkissa. Pessimistisessä samanaikaisuudessa, kun tiettyä tietuetta päivitetään, kaikki muut samanaikaiset päivitykset samassa tietueessa pysäytetään, kunnes nykyinen toiminto on valmis ja ohjaus luovutaan takaisin, jotta muut samanaikaiset toiminnot voivat jatkua. Optimistisessa samanaikaisuustilassa viimeinen tallennettu tietue "voittaa". Tässä tilassa oletetaan, että resurssiristiriidat, jotka johtuvat samanaikaisesta pääsystä jaettuun resurssiin, ovat epätodennäköisiä, mutta eivät mahdottomia.

Entity Framework tarjoaa oletusarvoisesti optimistisen samanaikaisuuden. Entity Framework ei tarjoa tukea pessimistiselle samanaikaisuudelle. Ymmärretään nyt, kuinka Entity Framework ratkaisee samanaikaisuusristiriidat työskennellessään optimistisessa samanaikaisuudessa (oletustila).

Kun työskentelet optimistisen samanaikaisuuden käsittelytilan kanssa, haluat yleensä tallentaa tiedot tietokantaan olettaen, että tiedot eivät ole muuttuneet sen jälkeen, kun ne ladattiin muistiin. Huomaa, että kun yrität tallentaa muutoksia tietokantaan SaveChanges-menetelmällä datakontekstin ilmentymässäsi, heitetään DbUpdateConcurrencyException. Ymmärretään nyt, kuinka voimme korjata tämän.

Voit tarkistaa samanaikaisuuden rikkomisen sisällyttämällä kentän entiteettiluokkaasi ja merkitsemällä sen Aikaleima-attribuutilla. Katso alla annettu kokonaisuusluokka.

public class Kirjoittaja

   {

public Int32 Id {get; aseta; }

julkinen merkkijono Etunimi {get; aseta; }

julkinen merkkijono Sukunimi {get; aseta; }

julkinen merkkijono Osoite {get; aseta; }

[Aikaleima]

julkinen tavu [] RowVersion {get; aseta; }

   }

Nyt Entity Framework tukee kahta samanaikaistilaa: Ei mitään ja Kiinteä. Ensin mainittu tarkoittaa, että samanaikaisuustarkistuksia ei suoriteta kokonaisuutta päivitettäessä, jälkimmäinen tarkoittaa, että ominaisuuden alkuperäinen arvo otetaan huomioon suoritettaessa WHERE-lausekkeita ajankohtana, jolloin tietoja päivitetään tai poistetaan. Jos sinulla on ominaisuus, joka on merkitty aikaleimalla, samanaikaisuustilaa pidetään kiinteänä, mikä puolestaan ​​tarkoittaa, että ominaisuuden alkuperäinen arvo otetaan huomioon WHERE-lausekkeessa, joka koskee kyseisen yksikön tietojen päivittämistä tai poistamista.

Voit ratkaista optimistiset samanaikaisuusristiriidat käyttämällä Päivitä-menetelmää päivittääksesi muistissa olevan entiteettisi nykyiset arvot tietokannan uusimpiin arvoihin. Kun olet ladannut päivitetyt tiedot uudelleen, voit yrittää säilyttää entiteettisi uudelleen tietokannassa. Seuraava koodinpätkä kuvaa, miten tämä voidaan saavuttaa.

käyttäen (var dbContext = uusi IDBDataContext ())

{

Kirjoittaja kirjoittaja = dbContext.Authors.Find (12);

kirjailija.osoite = "Hyderabad, Telengana, Intia";

yrittää

         {

dbContext.SaveChanges ();

         }

saalis (DbUpdateConcurrencyException ex)

         {

esim. Entry.Single (). Lataa uudelleen ();

dbContext.SaveChanges ();

         }

}

Huomaa, että voit hyödyntää DbUpdateConcurrencyException-ilmentymän Entries-menetelmää hakeaksesi luettelon DbEntityEntry-ilmentymistä, jotka vastaavat entiteettejä, joita ei voitu päivittää, kun SaveChanges-menetelmää kutsuttiin pitämään entiteetit tietokantaan.

Nyt juuri keskustelemamme lähestymistapa on usein nimeltään "tallennetut voitot" tai "tietokannan voitot", koska entiteettiin sisältyvät tiedot korvataan tietokannassa käytettävissä olevilla tiedoilla. Voit myös noudattaa toista lähestymistapaa, jota kutsutaan "asiakas voittaa". Tässä strategiassa tietokannan tiedot haetaan entiteetin täyttämiseksi. Pohjimmiltaan taustalla olevasta tietokannasta haetut tiedot asetetaan entiteetin alkuperäisiksi arvoiksi. Seuraava koodinpätkä kuvaa, miten tämä voidaan saavuttaa.

yrittää

{

dbContext.SaveChanges ();

}

saalis (DbUpdateConcurrencyException ex)

{

var data = ex.Entries.Single ();

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

}

Voit myös tarkistaa, onko toinen käyttäjä jo poistanut päivitettävän yksikön vai onko toinen käyttäjä jo päivittänyt sen. Seuraava koodinpätkä kuvaa, miten voit tehdä tämän.

saalis (DbUpdateConcurrencyException ex)

{

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

jos (entiteetti == null)

   {

Console.WriteLine ("Toinen käyttäjä on jo poistanut päivitettävän kokonaisuuden ...");

   }

muu

   {

Console.WriteLine ("Toinen käyttäjä on jo päivittänyt päivitettävän yksikön ...");

   }

}

Jos tietokantataulukossa ei ole aikaleiman saraketta tai riviversiota, voit käyttää ConcurrencyCheck-määritettä hyödyntämällä samanaikaisuusristiriitoja käytettäessä Entity Frameworkia. Näin tätä ominaisuutta käytetään.

[Taulukko ("Tekijät")

public class Kirjoittaja

{

julkinen kirjoittaja () {}

[Key]

julkinen int Id {get; aseta; }

[ConcurrencyCheck]

julkinen merkkijono Etunimi {get; aseta; }

julkinen merkkijono Sukunimi {get; aseta; }

julkinen merkkijono Osoite {get; aseta; }

}

Tehdessään SQL Server sisällyttää AuthorName-toiminnon automaattisesti suoritettaessa päivitys- tai poistolausekkeita tietokantaan.

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