Entity Framework - تنفيذ Soft Delete بطريقة احترافية

Entity Framework - تنفيذ Soft Delete بطريقة احترافية

عند التعامل مع البيانات في الأنظمة الحقيقية، غالبًا لا نرغب في حذف السجلات نهائيًا من قاعدة البيانات. بدلاً من ذلك، نستخدم تقنية Soft Delete، والتي تعني "الحذف الناعم" — أي تمييز السجل كمحذوف دون إزالته فعليًا من قاعدة البيانات.


🔹 لماذا نستخدم Soft Delete؟

نستخدم Soft Delete للأسباب التالية:

  • لحماية البيانات من الحذف الدائم عن طريق الخطأ.
  • للاحتفاظ بسجلات العمليات السابقة (Audit Trail).
  • لتمكين إمكانية استرجاع السجلات لاحقًا إذا لزم الأمر.

🔹 كيف ننفذ Soft Delete بطريقة احترافية مع EF Core؟

لتنفيذ Soft Delete مع Entity Framework Core، نتبع الخطوات التالية:

  1. إضافة خاصية مثل IsDeleted في الكيان (Entity).
  2. استخدام Global Query Filters لمنع استرجاع السجلات المحذوفة تلقائيًا.
  3. تعديل عملية الحذف بحيث تقوم بتحديث خاصية IsDeleted بدلاً من حذف السجل فعليًا.

🔹 مثال عملي على تنفيذ Soft Delete

1️⃣ تعديل الكيان (Entity)

نضيف خاصية IsDeleted إلى الكيان الخاص بنا. على سبيل المثال، كيان Product:


public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }

    public bool IsDeleted { get; set; } // ✅ خاصية الحذف الناعم
}

2️⃣ إعداد الفلترة التلقائية (Global Query Filter)

داخل DbContext نحدد قاعدة تمنع جلب السجلات المحذوفة تلقائيًا:


protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Product>().HasQueryFilter(p => !p.IsDeleted);
}

بهذا الشكل، جميع الاستعلامات التي تجلب بيانات Product ستتجاهل السجلات التي لها IsDeleted = true بشكل تلقائي دون الحاجة لكتابة شروط إضافية.

3️⃣ تغيير طريقة الحذف (Override Delete Behavior)

بدل استخدام Remove() لحذف الكائن، ننفذ عملية Soft Delete يدويًا عبر تحديث الخاصية:


// طريقة Soft Delete
public async Task SoftDeleteProductAsync(int id)
{
    var product = await _context.Products.FindAsync(id);

    if (product != null)
    {
        product.IsDeleted = true;
        await _context.SaveChangesAsync();
    }
}

بهذا الشكل، السجل يبقى موجودًا في قاعدة البيانات ولكن يتم تجاهله تلقائيًا في الاستعلامات!

🔹 ملاحظات احترافية حول Soft Delete

  • يمكنك إنشاء خاصية إضافية مثل DeletedAt لحفظ وقت الحذف.
  • يمكنك تعديل الكود ليدعم استعادة السجلات المحذوفة (Undo Delete).
  • يُفضل إنشاء Service مخصص للتعامل مع الحذف الناعم بدلاً من التعامل المباشر داخل الكائنات.

🔹 مقارنة بين Soft Delete وHard Delete

Soft Delete Hard Delete
لا يتم حذف السجل فعليًا، فقط يتم تمييزه كمحذوف يتم حذف السجل نهائيًا من قاعدة البيانات
يمكن استرجاع السجل لاحقًا لا يمكن استرجاع السجل بسهولة
مناسب للأنظمة التي تتطلب تدقيق وتتبع البيانات مناسب للأنظمة التي لا تحتاج للاحتفاظ بالسجلات القديمة

🔹 الخلاصة

Soft Delete أسلوب قوي لحماية بياناتك وتمكينك من تتبع السجلات دون خسارتها. باستخدام Global Query Filters في EF Core، يمكنك تطبيق Soft Delete بشكل أوتوماتيكي واحترافي على كل الاستعلامات بدون الحاجة لإعادة كتابة الشروط يدويًا.

تعليقات

المشاركات الشائعة من هذه المدونة

HTML - Text Formatting تنسيقات النص

1.1 SQL Introduction

Entity Framework - مقدمة عن Entity Framework