Entity Framework - التعامل مع الـConcurrency
Entity Framework Core - التعامل مع الـ Concurrency
Concurrency يعني كيفية التعامل مع حالات تعديل نفس السجل من أكثر من مستخدم أو عملية في نفس الوقت، ومنع فقدان أو استبدال بيانات بدون قصد.
---🔹 ما مشكلة الـ Concurrency؟
لو عدّل مستخدم سجلًا ثم في نفس اللحظة عدّله مستخدم آخر، من الممكن أن أحد التعديلات يُكتب فوق الآخر بدون أن يشعر المستخدم، مما يؤدي إلى فقد بيانات أو تضارب.
---🔹 كيف يحل EF Core مشكلة Concurrency؟
- استخدام خاصية تُسمى Concurrency Token (مثل Timestamp أو RowVersion).
- يتم التحقق من أن السجل لم يتغير منذ أن تم تحميله قبل محاولة حفظ التغييرات.
🔹 كيفية تفعيل التحكم في الـ Concurrency:
يمكنك إضافة خاصية RowVersion أو تحديد أي خاصية كـ Concurrency Token باستخدام Data Annotations أو Fluent API.
🔹 مثال عملي على استخدام RowVersion:
// ملف Student.cs
using System.ComponentModel.DataAnnotations;
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
---
🔹 ماذا يحدث عند محاولة تعديل سجل تم تعديله بالفعل؟
- EF Core سيصدر استثناء (Exception) من نوع
DbUpdateConcurrencyException. - يمكنك التقاط هذا الاستثناء ومعالجته برمجيًا (مثلاً إعلام المستخدم أو دمج التغييرات).
🔹 مثال عملي على التعامل مع استثناء Concurrency:
try
{
await dbContext.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException ex)
{
// هنا يمكن إعلام المستخدم أن السجل تم تعديله من قبل مستخدم آخر
Console.WriteLine("حدث تعارض في التعديلات، الرجاء إعادة تحميل البيانات والمحاولة مجددًا.");
}
---
🔹 ملاحظات إضافية:
- ✅ تأكد أن الخاصية المحددة كـ
[Timestamp]موجودة في الجدول في قاعدة البيانات بنوع بيانات مناسب (مثل rowversion في SQL Server). - ✅ يمكنك أيضًا استخدام أكثر من خاصية لتحديد الـ Concurrency Token باستخدام Fluent API.
✅ دعم التحكم بالـ Concurrency في EF Core يحمي بياناتك من التعديلات المتضاربة، ويجعل التطبيقات متعددة المستخدمين أكثر موثوقية وأمانًا.
تعليقات
إرسال تعليق