Sobes.tech
Middle

როგორ ხორციელდება Entity Framework Core-ში ქეშირება?

sobes.tech AI

პასუხი AI-სგან

Entity Framework Core (EF Core) ორი დონით კეშირებას უზრუნველყოფს:

  1. კონტექსტის კეში (Identity Resolution): ეს პირველი დონის კეშია. EF Core აკონტროლებს არსენციებს, რომლებიც იტვირთება მიმდინარე DbContext-ში. თუ EF Core-მა იპოვა იგივე გასაღების მნიშვნელობით არსენცია მეხსიერებაში, ის დაბრუნებს არსებულ ობიექტს, არავითარ მონაცემებს ბაზიდან.

    • თავიდან აცილებს ერთსა და იმავე მონაცემების რამდენჯერმე იტვირთვას ერთ კონტექსტში.
    • ავტომატურად განაახლებს მეხსიერებაში არსებულ მაგალითებს მათი მდგომარეობის ცვლილებისას.
    • მუშაობს როგორც წესი და სპეციალური კონფიგურაცია არ სჭირდება.
  2. საკითხვის კეში (Query Caching): ეს მეორე დონის კეშია. EF Core კეშავს SQL-სკრიპტების შესრულების გეგმებს. როდესაც იგივე შეკითხვა ხორციელდება, EF Core-ი შეიძლება გამოიყენოს უკვე კომპილირებული გეგმა, თავიდან აიცილოს SQL-ის ხელახლა კომპილაცია.

    • ოპტიმიზირებს ერთგვაროვანი სტრუქტურის მქონე (მაგრამ სხვადასხვა პარამეტრებით) შეკითხვების შესრულებას.
    • კეშავს არა პასუხს, არამედ მისი შესრულების გეგმას.
    • მართავს EF Core-ის შიდა მექანიზმები და პირდაპირი კონფიგურაცია ან გასუფთავება არ არის შესაძლებელი.

კონკრეტული მაგალითი კონტექსტის კეშის მუშაობის:

// ვივარაუდოთ, რომ მომხმარებელი with Id == 1 არსებობს მონაცემთა ბაზაში
using (var context = new AppDbContext())
{
    // პირველი იტვირთვა - ბაზიდან შეკითხვა
    var user1 = context.Users.FirstOrDefault(u => u.Id == 1);
    Console.WriteLine($"User1 იტვირთა: {user1.Name}");

    // მეორე იტვირთვა - ობიექტი იღება კონტექსტის კეშიდან
    var user2 = context.Users.FirstOrDefault(u => u.Id == 1);
    Console.WriteLine($"User2 იტვირთა: {user2.Name}");

    // user1 და user2 ერთსა და იმავე ობიექტის მითითებები არიან მეხსიერებაში
    Console.WriteLine($"ხართ ერთსა და იმავე ობიექტის მითითებები? {ReferenceEquals(user1, user2)}");
}

მნიშვნელოვანია იცოდეთ, რომ EF Core არ უზრუნველყოფს მონაცემთა შიდა კეშირებას, როგორც მთელი პროგრამის ფარგლებში (მაგალითად, ხშირად გამოყენებადი მონაცემების შენახვა შეკითხვებსა და მომხმარებლებს შორის). ასეთ სცენარებში ჩვეულებრივ გამოიყენება გარეგანი გადაწყვეტილებები, როგორიცაა Redis, IMemoryCache ან სხვა განაწილებული კეში.