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 أو على تحميل البيانات وعرضها لاحقًا.
تعليقات
إرسال تعليق