Aida-Hagh / EF-Core

Learn EF Core
1 stars 0 forks source link

Change Tracker #25

Open Aida-Hagh opened 4 months ago

Aida-Hagh commented 4 months ago

این ابزار وضعیت اشیاء را در طول چرخه‌ی عمرشان داخل DbContext پیگیری می‌کند و تغییرات اعمال شده بر روی اشیاء را زیر نظر می‌گیرد و به EF Core کمک می‌کند تا هنگام فراخوانی متد SaveChanges، تغییرات را به‌درستی در پایگاه داده اعمال کند.

مفاهیم کلیدی Change Tracker: وضعیت‌های شیء: اشیاء که توسط Change Tracker پیگیری می‌شوند می‌توانند در یکی از چند وضعیت زیر باشند: Added (افزوده شده): شیء جدید است و باید در پایگاه داده درج شود. Modified (تغییر یافته): برخی یا تمام خصوصیات شیء تغییر کرده‌اند. Deleted (حذف شده): شیء باید از پایگاه داده حذف شود. Unchanged (بدون تغییر): شیء تغییری نکرده و نیازی به اعمال تغییرات در پایگاه داده ندارد. Detached (جدا شده): شیء توسط DbContext پیگیری نمی‌شود.

فرض کنید یک مدل به نام Employee داریم و می خواهیم یک شیء Employee جدید ایجاد و آن را به DbContext اضافه کنیم : در این مثال وقتی شیء employee به DbContext اضافه می‌شود، وضعیت آن Added است. پس از فراخوانی SaveChanges و درج شیء در پایگاه داده، وضعیت آن به Unchanged تغییر می‌کند.

using (var context = new AppDbContext()) {

var employee = new Employee
{
    Name = "Ali",
    Position = "Developer",
    Salary = 5000
};

context.Employees.Add(employee);

// وضعیت شیء 'employee' را بررسی می‌کنیم
var state = context.Entry(employee).State;
Console.WriteLine(state); // خروجی: Added

// ذخیره تغییرات در پایگاه داده
context.SaveChanges();

// پس از ذخیره، وضعیت شیء 'employee' تغییر می‌کند
state = context.Entry(employee).State;
Console.WriteLine(state); // خروجی: Unchanged

}


می‌توانیم وضعیت یک شیء را به صورت دستی تغییر دهیم. به عنوان مثال:

using (var context = new AppDbContext()) {

var employee = context.Employees.Find(1);
employee.Salary = 5500;

// وضعیت شیء 'employee' را به صورت دستی به 'Modified' تغییر می‌دهیم
context.Entry(employee).State = EntityState.Modified;

context.SaveChanges();

}

در اینجا، تغییر وضعیت به Modified به EF Core اطلاع می‌دهد که این شیء باید به‌روزرسانی شود و تغییرات آن در پایگاه داده اعمال شود.

Aida-Hagh commented 3 months ago

مثال کاربردی : می‌خواهیم لیستی از کارمندان را نمایش دهیم و یکی از کارمندان را به‌روزرسانی کنیم.

غیر فعال کردن ردیابی (No-Tracking Queries): وقتی نمیخواهیم تغییری در دیتا بیس ایجاد کنیم بهتره از AsNoTracking استفاده کنیم (وقتی کوئری میزنیم).

// بازیابی لیست کارمندان بدون ردیابی تغییرات
var employees = context.Employees.AsNoTracking().ToList();

foreach (var employee in employees)
{
    Console.WriteLine($"Employee ID: {employee.Id}, Name: {employee.Name}, Position: {employee.Position}");
}

کاربرد ردیابی تغییرات در دستورات (Commands): در دستورات Add, Update و Delete، ردیابی تغییرات برای مدیریت این عملیات‌ها ضروری است.

// یافتن کارمند با ID مشخص
var employee = context.Employees.FirstOrDefault(e => e.Id == 1);

if (employee != null)
{
    // به‌روزرسانی اطلاعات کارمند
    employee.Name = "Updated Name";
    employee.Position = "Updated Position";

    // اعمال تغییرات به دیتابیس
    context.SaveChanges();
}