تكرار السؤال: …
الإجابة المختصرة
يحتفظ الـ Change Tracker بنسخة من الكائنات في الذاكرة لمراقبة تعديلاتها وحفظها بـ SaveChanges()؛ وAsNoTracking يلغي هذه المراقبة مما يوفر الذاكرة ويسرع استعلامات القراءة بشكل ضخم.
الشرح
عند تنفيذ أي استعلام عادي في EF Core، يقوم المحرك بإنشاء كائن ومطابقته بلقطة أصلية (Snapshot) في ذاكرة الـ DbContext لمراقبة أي تغيير يطرأ على الخصائص. في استعلامات القراءة فقط (مثل واجهات العرض والـ APIs)، لا توجد نية لتعديل البيانات وحفظها، لذا فإن استخدام .AsNoTracking() يمنع إنشاء لقطات التتبع، مما يخفض استهلاك الـ RAM ويسرع زمن الاستعلام بشكل ملحوظ (يختلف حسب حجم النتائج).
مثال بالكود
// استعلام قراءة فائق السرعة دون حجز ذاكرة تتبع
var users = await dbContext.Users
.AsNoTracking()
.Where(u => u.IsActive)
.ToListAsync();أخطاء شائعة
- استدعاء AsNoTracking() على كائن ترغب في تعديله ثم التساؤل عن سبب عدم حفظ التغييرات عند استدعاء SaveChangesAsync().
أسئلة متابعة
- كيف توفر دوال ExecuteUpdate و ExecuteDelete في EF Core 7+ أداءً أفضل بكثير للعمليات الجماعية؟
- لماذا لا يعد DbContext آمناً للخيوط المتزامنة (Not Thread-Safe) وما هي ميزة DbContext Pooling؟