Entity Framework - Detached Entities وإعادة تتبع الكيانات

Entity Framework Core - Detached Entities وإعادة تتبع الكيانات

Detached Entity يعني كائن غير متصل حاليًا بـ DbContext، أي أن EF Core لا يتتبع حالته، وبالتالي أي تغييرات عليه لن تُسجل تلقائيًا.

---

🔹 متى يحدث أن يكون الكيان Detached؟

  • عند إنشاء كائن جديد بدون إضافته إلى DbContext.
  • عند تحميل كائن ثم غلق السياق (DbContext) الذي كان يتبعه.
  • عند استخدام AsNoTracking() أثناء الاستعلام.
---

🔹 مثال عملي على كيان Detached:


// تحميل كائن بدون تتبع حالته

var student = await dbContext.Students
    .AsNoTracking()
    .FirstOrDefaultAsync(s => s.Id == 1);

// التعديل هنا لن يتم تتبعه تلقائيًا
student.Name = "اسم جديد";
await dbContext.SaveChangesAsync(); // لن يحدث أي تحديث فعلي
---

🔹 كيف نعيد تتبع كيان Detached؟

ببساطة نستخدم واحدة من الطرق التالية:

  • Attach: لإخبار DbContext أن الكيان موجود ولكن لم يتم تغييره.
  • Update: لإخبار DbContext أن الكيان قد تغير ويحتاج تحديثه.
---

1️⃣ استخدام Attach:


// إعادة تتبع الكائن بدون تغيير حالته إلى Modified

dbContext.Students.Attach(student);
student.Name = "اسم جديد";
await dbContext.SaveChangesAsync();
---

2️⃣ استخدام Update:


// إعادة تتبع الكائن مع اعتباره Modified

dbContext.Students.Update(student);
await dbContext.SaveChangesAsync();
---

🔹 متى تستخدم Attach ومتى تستخدم Update؟

  • Attach: إذا كنت تريد فقط تتبع الكيان بدون فرض تحديث لكل الحقول.
  • Update: إذا كنت متأكدًا أن الكيان قد تم تعديله وتريد حفظ التغييرات بالكامل.
---

🔹 ملاحظات إضافية:

  • ✅ استخدام Update بحذر لأنه قد يؤدي إلى تحديث كل الأعمدة حتى غير المعدلة مما يؤثر على الأداء أحيانًا.
  • ✅ من الأفضل استخدام Attach إذا كنت تريد التحكم الدقيق في الحقول المعدلة فقط.

✅ فهم طريقة التعامل مع الكيانات Detached ضروري جدًا عند بناء تطبيقات تعتمد على أكثر من Context أو على تحميل البيانات وعرضها لاحقًا.

تعليقات

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

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

1.1 SQL Introduction

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