Entity Framework - كيف يتابع EF Core التغييرات بطريقة مبسطة
Entity Framework Core - كيف يتابع EF Core التغييرات؟
الفكرة الأساسية:
عندما تقوم بجلب بيانات من قاعدة البيانات باستخدام EF Core، فإن الكائنات التي ترجع (Entities) تكون تحت "مراقبة" EF Core.
أي تعديل تقوم به على الكائن، يقوم EF Core بالتعرف عليه ويجهزه للتخزين في قاعدة البيانات عند تنفيذ SaveChanges()
.
🧠 كيف يقوم EF Core بذلك؟
عند تنفيذ الكود التالي:
var employee = context.Employees.FirstOrDefault(e => e.Id == 1);
- يتم إنشاء كائن employee
في الذاكرة.
- يقوم EF Core بتسجيل هذا الكائن في أداة داخلية تُسمى Change Tracker.
- أداة Change Tracker تشبه دفتر ملاحظات يقوم بمراقبة كل الكائنات التي تم إرجاعها عبر DbContext
.
✏️ ماذا يحدث عند تعديل الكائن؟
employee.Name = "Mahmoud Elsokkary";
يقوم Change Tracker بتسجيل هذا التغيير:
- الاسم القديم كان مثلًا "Mahmoud"، والآن أصبح "Mahmoud Elsokkary".
وعند تنفيذ:
context.SaveChanges();
يقوم EF Core بإرسال أمر SQL لتحديث قاعدة البيانات فقط بما تغير:
UPDATE Employees SET Name = 'Mahmoud Elsokkary' WHERE Id = 1
🎯 الخلاصة السريعة:
- Change Tracker: أداة داخل EF Core تراقب الكائنات المرتبطة بالـ
DbContext
. - عند التعديل: يتم رصد التغييرات وتحضير أوامر SQL عند الحفظ.
- عند تنفيذ SaveChanges: يتم إرسال التعديلات فقط إلى قاعدة البيانات.
✨ أمثلة عملية:
مثال 1: تعديل كائن موجود
var customer = context.Customers.First(c => c.Id == 10);
customer.Email = "newemail@example.com";
context.SaveChanges();
📌 هنا EF Core سيقوم بتحديث البريد الإلكتروني فقط.
مثال 2: إضافة كائن جديد
var newCustomer = new Customer { Name = "Noor", Email = "noor@example.com" };
context.Customers.Add(newCustomer);
context.SaveChanges();
📌 هنا EF Core يعرف أن الكائن جديد، وسيقوم بتنفيذ أمر INSERT
.
مثال 3: حذف كائن
var customer = context.Customers.First(c => c.Id == 5);
context.Customers.Remove(customer);
context.SaveChanges();
📌 هنا EF Core سينفذ أمر DELETE
.
📢 ملاحظات إضافية مهمة:
- إذا تم فصل الكائن عن
DbContext
(مثلاً بإغلاق الاتصال)، فإن EF Core سيتوقف عن متابعته. - عند التعامل مع كائنات Detached، يجب إبلاغ EF Core يدويًا بالتغييرات.
🔥 معلومات إضافية:
EF Core يحتفظ بحالتين لكل كائن يتابعه:
- Original Values: القيم الأصلية عند تحميل الكائن من قاعدة البيانات.
- Current Values: القيم الحالية بعد أي تعديل.
وعند تنفيذ SaveChanges()
، يقوم بالمقارنة بين القيمتين ويحدد التغييرات التي يجب إرسالها.
🎯 الخلاصة النهائية:
- EF Core يراقب الكائنات بشكل أوتوماتيكي.
- أي تعديل يتم تسجيله وتحضيره لإرساله لقاعدة البيانات.
- عند تنفيذ
SaveChanges()
يتم إرسال التغييرات فقط مما يجعل الأداء أفضل وأسرع.
تعليقات
إرسال تعليق