تكرار السؤال: …
الإجابة المختصرة
بتعريف شرط بـ HasQueryFilter داخل OnModelCreating يدمج شرط WHERE تلقائياً في كل استعلامات النموذج ما لم يُعطل بـ IgnoreQueryFilters().
الشرح
تضمن Global Query Filters عدم نسيان شرط الأمان أو الحذف اللين في أي مكان في التطبيق. بتحديد modelBuilder.Entity<Order>().HasQueryFilter(o => !o.IsDeleted && o.TenantId == _tenantId)، يضمن EF Core أن كل استعلام SELECT (بما في ذلك العلاقات عبر Include) سيحتوي تلقائياً على هذه الشروط، مانعاً تسريب بيانات مستأجر لآخر.
مثال بالكود
protected override void OnModelCreating(ModelBuilder modelBuilder) {
modelBuilder.Entity<User>()
.HasQueryFilter(u => !u.IsDeleted);
}
// لطلب المحذوفات عمداً:
var allUsers = await db.Users.IgnoreQueryFilters().ToListAsync();أخطاء شائعة
- عدم توفير فهارس مركبة تشمل أعمدة الـ Query Filters (مثل IsDeleted و TenantId) مما يبطئ كل استعلامات النظام.