Phones.cs - Dasturiy injiniring (EntityFramework 6)

|
Dasturiy injiniring (EntityFramework 6)
|
bet | 25/53 | Sana | 30.11.2023 | Hajmi | 1,39 Mb. | | #108476 |
Bog'liq Dasturiy injiniringPhones.cs
using System.Data.Entity;
namespace Init
{
class Phone
{
public int Id { get; set; }
public string Name { get; set; }
public int Price { get; set; }
}
}
MobileContext.cs
using System.Data.Entity;
namespace Init
{
class MobileContext : DbContext
{
static MobileContext()
{
Database.SetInitializer(new MyContextInitializer());
}
public MobileContext()
: base("DefaultConnection")
{ }
public DbSet Phones { get; set; }
}
}
MyContextInitializer.cs
using System.Data.Entity;
namespace Init
{
class MyContextInitializer : DropCreateDatabaseAlways
{
protected override void Seed(MobileContext db)
{
Phone p1 = new Phone { Name = "Samsung Galaxy S5", Price = 14000 };
Phone p2 = new Phone { Name = "Nokia Lumia 630", Price = 8000 };
db.Phones.Add(p1);
db.Phones.Add(p2);
db.SaveChanges();
}
}
}
Programm.cs
using System;
namespace Init
{
class Program
{
static void Main(string[] args)
{
using (MobileContext db = new MobileContext())
{
var phones = db.Phones;
foreach (Phone p in phones)
Console.WriteLine("{0}.{1} - {2}", p.Id, p.Name, p.Price);
}
Console.ReadLine();
}
}
}
Initsializator klassi yuqorida keltirilgan biror klassdan vorislanadi. Bizning misolda DropCreateDatabaseAlways klassidan vorislangan.
Initsializatsiyaning barcha amallari Seed metodida amalga oshiriladi. Initsializatsiya jarayoni DBga ma’lumotlar konteksti orqali saqlanadi.
Initsializator ishga tushishi uchun uni chaqirish lozim. Initsializatorni chaqirish uchun kontekst klassidagi statik konstruktordan foydalanishimiz mumkin:
static MobileContext()
{
Database.SetInitializer(new MyContextInitializer());
}
Entity Framework da parallel dasturlash
Bir nechta foydalanuvchilar bir vaqtda ma’lumotlar ustida Entity Framework texnologiyasi orqali amal bajarayotganda parallellash muammosi yuzaga keladi. Masalan, ikkita foydalanuvchi bir-biridan mustaqil tarzda bir ob’ektni tahrirlayotgan bo’lsa, birinchi foydalanuvchi ma’lumotlarni DBga saqlagandan so’ng, ikkinchi foydalanuvchi aktual bo’lmagan ma’lumotlar ustida amal bajaradi.
Misol orqali ushbu amalni ko’rib chiqamiz. ASP.NET MVC dasturida tahrirlash uchun standart amal quyidagicha aniqlangan bo’lsin:
public ActionResult Edit(int id)
{
Person p = db.Persons.Find(id);
return View(p);
}
[HttpPost]
public ActionResult Edit(Person p)
{
db.Entry(p).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
Yuqorida keltirilgan dastur kodi to’g‘ri ishlasada, ikkita foydalanuvchi bitta ob’ekt ustida tahrirlash amali bajarayotganda, birinchi foydalanuvchi o’zgartirilgan ob’ekt ma’lumotlarini xotiraga saqlagach, ikkinchi foydalanuvchi eski ma’lumotlar ustida amal bajaradi.
Bunday holatda Entity Framework bizga nimani taklif qiladi?
Ushbu hol uchun parallellash texnologiyasini qo’llash mumkin. Ikki turdagi parallellash texnologiyasi mavjud: optimistik va pessimistik.
Pessimistik parallellashtirishda (pessimistic concurrency) DBda amal bajarilayotgan ob’ektdan foydalana olish (dostup) cheklanadi. Ya’ni satrlar faqat o’qish uchun statusiga keltiriladi. Pessimistik parallellashtirishda DB darajasidagi murakkab dasturiy mantiq amallarga ishonch bildiriladi va barcha amallarni DB o’zi bajaradi. Entity Frameworkda pessimistik parallellashtirish qo’llab quvvatlanmaydi.
Optimistik parallellashda (optimistic concurrency) ma’lumotlar ustida bir nechta foydalanuvchilar parallel amal bajarishlari uchun Entity Framework ning bir nechta metodlari mavjud.
Ushbu metodlardan biri model xususiyatiga [Timestamp] atributini joriy etish hisoblanadi. Ushbu atribut orqali xususiyatga mos jadval yozuvi o’zgartirilishi nazorat qilinadi. Masalan:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
|
| |