Programmēšana

Kā rīkoties vienlaicīguma konfliktos Entity Framework

Vienlaicīguma apstrādi var izmantot, lai saglabātu datu integritāti un datu konsekvenci, kad vairāki lietotāji vienlaikus piekļūst vienam un tam pašam resursam. Vienlaicīguma pārkāpumi var rasties, ja jums ir savstarpēji atkarīgi darījumi, t.i., darījumi, kas ir atkarīgi viens no otra un mēģina piekļūt vienam un tam pašam resursam.

Vienlaicīguma konfliktu risināšana Entity Framework

Tagad sapratīsim, kā katra no šīm stratēģijām darbojas Entity Framework. Pesimistiskajā vienlaicīgajā laikā, kad tiek atjaunināts konkrēts ieraksts, visi pārējie vienlaikus atjauninājumi tajā pašā ierakstā tiks aizturēti, līdz pašreizējā darbība būs pabeigta un vadība tiks atteikta, lai citas vienlaicīgas darbības varētu turpināt. Optimistiskajā vienlaicīguma režīmā pēdējais saglabātais ieraksts "uzvar". Šajā režīmā tiek pieņemts, ka resursu konflikti, kas saistīti ar vienlaicīgu piekļuvi koplietotam resursam, ir maz ticams, bet ne neiespējami.

Starp citu, Entity Framework pēc noklusējuma nodrošina optimismu vienlaikus. Entity Framework nenodrošina atbalstu pesimistiskai vienlaicīgībai. Tagad sapratīsim, kā Entity Framework atrisina vienlaicīguma konfliktus, strādājot optimistiskajā vienlaicīgumā (noklusējuma režīms).

Strādājot ar optimistisku vienlaicīguma apstrādes režīmu, parasti vēlaties saglabāt datus savā datu bāzē, pieņemot, ka dati nav mainījušies kopš to ielādes atmiņā. Ņemiet vērā, ka, mēģinot saglabāt datu bāzes izmaiņas, izmantojot SaveChanges metodi datu konteksta instancē, tiks izmests DbUpdateConcurrencyException. Tagad sapratīsim, kā mēs to varam novērst.

Lai pārbaudītu vienlaicīguma pārkāpumu, jūs varat iekļaut lauku savā entītijas klasē un atzīmēt to, izmantojot laika zīmoga atribūtu. Skatiet tālāk norādīto entītiju klasi.

sabiedrības klase Autors

   {

public Int32 Id {get; komplekts; }

publiskā virkne FirstName {get; komplekts; }

publiskā virkne Uzvārds {get; komplekts; }

publiska virkne Adrese {get; komplekts; }

[Laika zīmogs]

publiskais baits [] RowVersion {get; komplekts; }

   }

Tagad Entity Framework atbalsta divus vienlaicīguma režīmus: Neviens un Fiksēts. Pirmais nozīmē, ka, atjauninot entītiju, netiks veiktas vienlaicīguma pārbaudes, bet otrais nozīmē, ka īpašuma sākotnējā vērtība tiks ņemta vērā, izpildot WHERE klauzulas laikā, kad tiek atjaunināti vai dzēsti dati. Ja jums ir rekvizīts, kas atzīmēts, izmantojot Laika zīmogu, vienlaicīguma režīms tiek uzskatīts par Fiksētu, kas savukārt nozīmē, ka rekvizīta sākotnējā vērtība tiks ņemta vērā WHERE klauzulā par jebkuras konkrētas entītijas datu atjaunināšanu vai dzēšanu.

Lai atrisinātu optimistiskus vienlaicīguma konfliktus, varat izmantot metožu Pārlādēt priekšrocības, lai atjauninātu atmiņā esošās entītijas pašreizējās vērtības ar jaunākajām datu bāzes vērtībām. Kad esat atkārtoti ielādējis atjauninātos datus, varat mēģināt vēlreiz saglabāt savu entītiju datu bāzē. Šis koda fragments parāda, kā to var panākt.

izmantojot (var dbContext = new IDBDataContext ())

{

Autora autors = dbContext.Authors.Find (12);

autors. Adrese = "Hyderabad, Telengana, INDIA";

mēģiniet

         {

dbContext.SaveChanges ();

         }

nozveja (DbUpdateConcurrencyException ex)

         {

piemēram, Entry.Single (). Pārlādēt ();

dbContext.SaveChanges ();

         }

}

Ņemiet vērā, ka, izmantojot DbUpdateConcurrencyException gadījumu, varat izmantot metodi Entries, lai izgūtu DbEntityEntry gadījumu skaitu, kas atbilst entītijām, kuras nevarēja atjaunināt, kad tika izsaukta metode SaveChanges, lai saglabātu entītijas datu bāzē.

Tagad tikko apspriesto pieeju bieži sauc par “uzglabātajiem laimestiem” vai “uzvar datubāzē”, jo entītijā esošos datus pārraksta ar datu bāzē pieejamajiem datiem. Varat arī izmantot citu pieeju, ko sauc par "klienta uzvaru". Šajā stratēģijā dati no datu bāzes tiek izgūti, lai aizpildītu entītiju. Būtībā dati, kas iegūti no pamatā esošās datu bāzes, tiek iestatīti kā entītijas sākotnējās vērtības. Šis koda fragments parāda, kā to var panākt.

mēģiniet

{

dbContext.SaveChanges ();

}

nozveja (DbUpdateConcurrencyException ex)

{

var dati = ex.Entries.Single ();

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

}

Varat arī pārbaudīt, vai entītiju, kuru mēģināt atjaunināt, jau ir izdzēsis cits lietotājs, vai to jau ir atjauninājis cits lietotājs. Šis koda fragments parāda, kā to izdarīt.

nozveja (DbUpdateConcurrencyException ex)

{

var entītija = ex.Entries.Single (). GetDatabaseValues ​​();

ja (entītija == nulle)

   {

Console.WriteLine ("Atjaunināmo entītiju cits lietotājs jau ir izdzēsis ...");

   }

cits

   {

Console.WriteLine ("Atjaunināmo entītiju jau ir atjauninājis cits lietotājs ...");

   }

}

Ja jūsu datu bāzes tabulā nav laika zīmoga kolonnas vai rindas versijas, varat izmantot atribūta ConcurrencyCheck priekšrocības, lai noteiktu vienlaicīguma konfliktus, izmantojot Entity Framework. Lūk, kā šis īpašums tiek izmantots.

[Tabula ("Autori"]

sabiedrības klase Autors

{

publiskais autors () {}

[Atslēga]

public int Id {get; komplekts; }

[ConcurrencyCheck]

publiskā virkne FirstName {get; komplekts; }

publiskā virkne Uzvārds {get; komplekts; }

publiska virkne Adrese {get; komplekts; }

}

Veicot šo darbību, SQL Server, veicot atjaunināšanas vai dzēšanas paziņojumus datu bāzē, automātiski iekļauj AuthorName.