Timestamp atributi RowVersion

|
Timestamp atributi RowVersion
|
bet | 26/53 | Sana | 30.11.2023 | Hajmi | 1,39 Mb. | | #108476 |
Bog'liq Dasturiy injiniringTimestamp atributi RowVersion xususiyati qiymati o’zida modelning Entity Framework amallari orqali o’zgartirilganligi yoki o’chirilganligi haqidagi ma’lumotlarni o’zida saqlaydi. Xususiyat tipi sifatida baytlar massividan foydalanilgan.
Shuningdek, Person modeliga mos ob’ektni o’zgartirishga mo'ljallangan ko’rinishda ushbu xususiyatni yashiringan tarzda e’lon qilish lozim:
@Html.HiddenFor(model => model.RowVersion)
Endilikda ikkita foydalanuvchi bir vaqtda biror ob’ektni tahrirlamoqchi bo’lishsa, birinchi foydalanuvchi o’zgartirilgan ma’lumotlarni xotiraga saqlashi natijasida ikkinchi foydalanuvchiga
System.Data.Entity.Infrastructure nomlar fazosida joylashgan DbUpdateConcurrencyException xatoligi qaytariladi:
[HttpPost]
public ActionResult Edit(Person p)
{
try
{
db.Entry(p).State = EntityState.Modified;
db.SaveChanges();
}
catch (DbUpdateConcurrencyException ex)
{
ViewBag.Error = “Ob’ekt avval boshqa foydalanuvchi tomonidan o’zgartirilgan”;
return View(p);
}
return RedirectToAction("Index");
}
Yuzaga kelgan xatolikni foydalanuvchiga ma’lum qilish uchun ViewBag.Error dan foydalanamiz va ikkinchi foydalanuvchining modelda amalga oshirgan o’zgarishlari DBda saqlanmaydi.
Тranzaksiyalarni boshqarish
Model ustida bajarilgan qo’shish, o’zgartirish va o’chirish amallarini DBda qayd etish uchun SaveChanges() metodi chaqirilganda Entity Framework tranzaksiyani amalga oshiradi.
C# tilida tranzaksiyalarni boshqarish usullari mavjud. Tranzaksiyalarni boshqarish asosan DBda bir nechta o’zaro bog‘liq amallarni bajarishda qo’llaniladi. Agar tranzaksiyadagi amallar ketma-ketiligida biror amal noto’g‘ri bajarilsa, avval bajarilgan amallar barchasi bekor qilinadi. Misolda ushbu amallarni ko’rib chiqamiz. Bizning DBda Nodir ismli inson mavjud bo’lsin. U o'g‘il farzand ko’rib, uning ismini ham Nodir qo’ydi. Ushbu ikkita Nodirlarni farqlash uchun katta Nodir va kichkina Nodir deb o’zgartiramiz:
static void Main(string[] args)
{
using (UserContext db = new UserContext())
{
using (var transaction = db.Database.BeginTransaction())
{
try
{
Person p1 = db.Persons.FirstOrDefault(p => p.Name == "Bob");
p1.Name = "Bob Senior";
db.Entry(p1).State = EntityState.Modified;
Person p2 = new Person { Name = "Bob Junior", Age = 1 };
db.Persons.Add(p2);
db.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
foreach (Person p in db.Persons.ToList())
Console.WriteLine("Name: {0} Age: {1}", p.Name, p.Age);
}
}
Yangi tranzaksiyani hosil qilish uchun quyidagi koddan foydalaniladi:
var transaction = db.Database.BeginTransaction()
Model ustida zarur amallar bajarilgach, o’zgartirishlarni transaction.Commit() metodi orqali DBga fiksirlash mumkin.
Ammo model ustda amallarni bajarish jarayonida xatolik yuzaga kelganda transaction.Rollback() metodi orqali barcha amallar bekor qilinadi.
LINQ to Entities
LINQ to Entities ga kirish
Yuqoridagi bo’limlarda DBdan ma’lumotlarni olishda bir qator amallarni ko’rib o’tgan edik. Ushbu amallarning asosida LINQ (Language Integrated Query) yoki LINQ to Entities texnologiyasi yotadi. LINQ to Entities oddiy va tushunarli yondashuv hisoblanib, ma’lumotlarni SQL tiliga yaqin ifodalar yordamida olishga xizmat qiladi.
DBdagi ma’lumotlari ustida LINQ so’rovlari orqali amallar bajarsakda, DBda faqatgina SQL tilida yozilgan so’rovlar tushaniladi. Shuning uchun LINQ to Entities va DB o'rtasida vositachi mavjud bo’lib, u EntityClient provayderi hisoblanadi. U orqali SQL Server bilan ishlash uchun ADO.NET provayderi vositasida interfeys shakllantiriladi.
DB bilan ishlash uchun avvalo EntityConnection ob’ekti hosil qilinadi. EntityCommand orqali u turli so’rovlarni DBga uzatadi. EntityDataReader ob’ekti yordamida esa DBdan ma’lumotlarni o’qib oladi.
Ammo dasturchilar ushbu ob’ektlarga to’g‘ridan to’g‘ri murojaat qilishlari shart emas. Barcha amallarni fremwork amalga oshiradi. Dasturchilar asosan LINQ yordamida so’rovlarni amalga oshirishlari lozim.
|
| |