{
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 DropCreateDatabaseAlwaysklassidan 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());
}
Bir nechta foydalanuvchilar bir vaqtda ma’lumotlar ustida Entity Framework texnologiyast orqaldi 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’ektga 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 Framework da 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; }