Autoriuswww.itsvse.com @小渣渣 ! Sėkmingai įterpkite pagrindinius duomenis! "ConcurrencyCheck" funkcijos testavimas baigtas Atnaujinimas sėkmingas! 1 pastaba Atnaujinimas yra išskirtinis! 2 pastaba, nenormali informacija! Sakinio saugojimas, naujinimas, įterpimas arba naikinimas paveikė netikėtą eilučių skaičių (0). Objektai gali būti modifikuoti arba panaikinti įkėlus objektus. Žr. http://go.microsoft.com/fwlink/?LinkId=472540 informacijos apie optimistinių sutapimo išimčių supratimą ir tvarkymą.
Patikrinkite skirtumą tarp laiko žymos ir ConcurrencyCheck UpdateTab1 atnaujinimas sėkmingas! Vardas 1 UpdateTab2 atnaujinimas sėkmingas! Vardas 1 UpdateTab2 atnaujinimas yra nenormalus! Vardas 2, nenormali informacija! Sakinio saugojimas, naujinimas, įterpimas arba naikinimas paveikė netikėtą eilučių skaičių (0). Objektai gali būti modifikuoti arba panaikinti įkėlus objektus. Žr. http://go.microsoft.com/fwlink/?LinkId=472540 informacijos apie optimistinių sutapimo išimčių supratimą ir tvarkymą. UpdateTab1 atnaujinimas sėkmingas! Vardas 2
【Laiko žyma】 Funkcija TimeStamp gali būti taikoma lauko klasei, kuri turi tik vieno baitų masyvo ypatybę, ir ši funkcija nustato stulpelio tipą tiemStamp. Atliekant vienalaikius patikrinimus, Code-First automatiškai naudoja šį lauką TimeStamp tipas.
【Sutapimo patikrinimas】 ConcurrencyCheck funkcija gali būti taikoma domeno klasės ypatybėms. Kai EF atlieka naujinimo operaciją, Code-First įrašo stulpelio reikšmę į sakinį where sąlyga, ir jūs galite naudoti šią CurrencyCheck funkciją, jei norite naudoti esamus stulpelius sutapimui tikrinti, o ne naudoti atskirą TimeStamp stulpelį sutapimui tikrinti.
Pradėkime nuo naujo konteksto objekto sukūrimo, kad parodytume skirtumą tarp laiko žymos ir sutapimo apdorojimo metu!
Štai konteksto kodas:
Pažvelkime į duomenų bazės stulpelius taip:
Pamatysime, kad 1 ir 2 skirtukuose yra stulpeliai ID, Pavadinimas ir Pastaba, o 2 skirtuke yra daugiau RowVersion stulpelių nei 1 skirtuke.
Pirmiausia pridėkite testo kodą:
【Sutapimo patikrinimo principas】
Mes pridėjome ConcurrencyCheck funkciją prie Tab1 ypatybės Pastaba,
Kai tuo pačiu metu atnaujiname tų pačių duomenų atributo Name reikšmę, jokia išimtis nebūna!
Generuoti SQL sakinius:
exec sp_executesql N'UPDATE [dbo]. [1 skirtukas] SET [Vardas] = @0 WHERE (([id] = @1) AND ([Pastaba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name1',@1=1,@2=N'Note1' exec sp_executesql N'UPDATE [dbo]. [1 skirtukas] SET [Vardas] = @0 WHERE (([id] = @1) AND ([Pastaba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'name2',@1=1,@2=N'note1' Kai tuo pačiu metu atnaujiname tų pačių duomenų ypatybės Remark reikšmę, pateikiame išimtį!
Generuoti SQL sakinius:
exec sp_executesql N'UPDATE [dbo]. [1 skirtukas] SET [Pastaba] = @0 WHERE (([id] = @1) AND ([Pastaba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Note1',@1=1,@2=N'Note' exec sp_executesql N'UPDATE [dbo]. [1 skirtukas] SET [Pastaba] = @0 WHERE (([id] = @1) AND ([Pastaba] = @2)) ',N'@0 nvarchar(max) ,@1 int,@2 nvarchar(max) ',@0=N'Pastaba 2',@1=1,@2=N'Pastaba' Galime pastebėti, kad jei tuo pačiu metu paimsime tuos pačius duomenis su ID 1, gausime atributo Remark vertę, o atnaujindami atributą Remark naudosime Remark kaip atnaujinimo sąlygą.
Pirmasis sql sakinys gali būti sėkmingai atnaujintas, tada pastaba pakeičiama į "1 pastaba", o atnaujinus antrąjį sql sakinį, atnaujinti nepavyks, nes pasikeitė pastabos reikšmė.
【Laiko žymos principas】
Mes pridėjome RowVersion ypatybę į Tab2 (galite imtis bet kokio pavadinimo) ir pridėjome Timestamp funkciją!
Kai tuo pačiu metu atnaujiname tų pačių duomenų pavadinimo reikšmę, pirmasis atnaujinimas pavyksta, antrasis atnaujinimas nepavyksta ir pateikiama išimtis, pažvelkime į sugeneruotą sql kodą!
exec sp_executesql N'UPDATE [dbo]. [2 skirtukas] SET [Vardas] = @0 WHERE ((([id] = @1) AND ([RowVersion] = @2)) AND ([Pastaba] = @3)) SELECT [RowVersion] IŠ [dbo]. [2 skirtukas] KUR @@ROWCOUNT > 0 IR [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'Name1',@1=1,@2=0x00000000000007D1,@3=N'Pastaba' exec sp_executesql N'UPDATE [dbo]. [2 skirtukas] SET [Vardas] = @0 WHERE ((([id] = @1) AND ([RowVersion] = @2)) AND ([Pastaba] = @3)) SELECT [RowVersion] IŠ [dbo]. [2 skirtukas] KUR @@ROWCOUNT > 0 IR [id] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8),@3 nvarchar(max) ',@0=N'name2',@1=1,@2=0x00000000000007D1,@3=N'Pastaba' Vykdant antrąjį SQL sakinį, nes kur sąlygos duomenų nebegalima rasti, atnaujinimas nepavyksta ir išimtis yra išmesta!
Sėkmingai įvykdžius pirmąjį sql sakinį, RowVersion reikšmė pasikeis, kaip parodyta paveikslėlyje žemiau:
RowsVersion yra laiko žyma
Trūkstamų naujinimų sprendimo būdas
Trūkstamų naujinimų samprata: Kai vartotojai tuo pačiu metu keičia duomenų eilutę, jie pirmiausia nuskaito duomenis, įdeda juos į priekinę dalį modifikuoti, o tada pateikia duomenis, kai jie modifikuojami, kad galutiniai pateikti duomenys perrašytų anksčiau pateiktus duomenis, o tai sukelia prarastą naujinimą.
Trumpai tariant, čia yra būdų, kaip išvengti naujinimų praradimo:
Naudokite RowsVersion laiko žymą.
Jei eilutė neatitinka reikšmės prieš skaitant, tai reiškia, kad kita operacija atnaujino šį stulpelį, todėl šio stulpelio negalima atnaujinti, taip išvengiant naujinimų praradimo.
Galiausiai pridėkite šaltinio kodą:
CodeFirstDemo.rar
(4.94 KB, Atsisiuntimų skaičius: 13)
|