Entity Framework - شرح Entity States وكيفية التعامل معها
Entity Framework - شرح Entity States وكيفية التعامل معها
عند العمل مع Entity Framework Core، يتم تتبع حالة الكيانات (Entities) بواسطة الـ DbContext. كل كيان (Entity) مرتبط بسياق قاعدة البيانات يكون له حالة معينة تُعرف باسم Entity State، وهي التي تحدد كيف سيتعامل EF Core مع هذا الكيان عند تنفيذ الأمر SaveChanges().
🔹 ما هي Entity States؟
Entity State تعبر عن حالة الكائن بالنسبة لقاعدة البيانات. أي: هل هو كائن جديد؟ أم تم تعديله؟ أم تم حذفه؟ أم لم يتم تغييره؟
🔹 أنواع Entity States في EF Core
- Added: الكيان جديد وسيتم إضافته إلى قاعدة البيانات عند تنفيذ
SaveChanges(). - Modified: تم تعديل الكيان وسَيُحدّث السجل المقابل له في قاعدة البيانات.
- Deleted: سيتم حذف الكيان من قاعدة البيانات.
- Unchanged: الكيان لم يتغير منذ تحميله أو تتبعه.
- Detached: الكيان غير مرتبط حاليًا بأي
DbContext(خارج التتبع).
🔹 كيفية فحص حالة كيان (Entity State)
يمكنك فحص حالة أي كيان باستخدام الخاصية Entry().State داخل الـ DbContext.
var product = await _context.Products.FindAsync(1);
var state = _context.Entry(product).State;
// النتيجة تكون مثلا: Unchanged
Console.WriteLine(state);
🔹 كيفية تغيير حالة الكيان يدويًا
يمكنك تحديد حالة الكيان يدويًا باستخدام الكود التالي:
var product = new Product { Id = 1 };
_context.Entry(product).State = EntityState.Deleted;
await _context.SaveChangesAsync();
في هذا المثال: حتى لو لم نحمل بيانات المنتج بالكامل من القاعدة، يكفي تعيين EntityState.Deleted لحذفه مباشرة عند تنفيذ SaveChanges().
🔹 متى يتم تغيير Entity State تلقائيًا؟
EF Core يقوم بتغيير حالة الكيان تلقائيًا بناءً على العمليات التي تقوم بها:
- عند إضافة كائن جديد بواسطة
Add()أوAddAsync()➔ يتحول إلى Added. - عند تحميل كائن من القاعدة ➔ يكون Unchanged.
- عند تعديل خاصية في كائن محمّل ➔ يصبح Modified.
- عند تنفيذ
Remove()➔ يصبح Deleted.
🔹 مثال عملي متكامل لإدارة Entity States
// تحميل كائن
var product = await _context.Products.FindAsync(1);
// تعديل بياناته
product.Name = "اسم جديد";
// حالة الكائن الآن: Modified
Console.WriteLine(_context.Entry(product).State);
// حفظ التعديلات
await _context.SaveChangesAsync();
// حالة الكائن بعد الحفظ: Unchanged
Console.WriteLine(_context.Entry(product).State);
🔹 ملاحظات احترافية
- انتبه إلى أن استخدام
AsNoTracking()عند جلب البيانات يعني أن الكيان سيكون Detached ولن يتم تتبعه تلقائيًا. - في بعض الحالات المتقدمة (مثل العمل مع DTOs)، قد تحتاج لضبط الحالة يدويًا قبل الحفظ.
- تعامل بحذر مع الكيانات Modified وDeleted خاصة عندما تكون التعديلات قادمة من المستخدم مباشرة (تحقق من صحة البيانات أولًا).
🔹 الخلاصة
Entity States من أهم المفاهيم التي يجب فهمها عند استخدام Entity Framework Core، لأنها تتحكم بكيفية تعامل السياق (DbContext) مع الكيانات عند تنفيذ الحفظ. إدارة الحالات بشكل صحيح يضمن تحديث قاعدة البيانات بشكل آمن وفعال.
تعليقات
إرسال تعليق