Entity Framework - Data Annotation خصائص متقدمة [NotMapped]، [ConcurrencyCheck]، [Timestamp]، [Index].

8.8 Entity Framework - خصائص متقدمة [NotMapped]، [ConcurrencyCheck]، [Timestamp]، [Index]

بالإضافة إلى السمات الأساسية في Data Annotations، يوفر Entity Framework Core مجموعة من الخصائص المتقدمة التي تمنحنا تحكمًا إضافيًا في الكيانات وقواعد البيانات، مثل: [NotMapped]، [ConcurrencyCheck]، [Timestamp]، و[Index].


🔹 [NotMapped] - تجاهل الخاصية من التتبع

تُستخدم خاصية [NotMapped] لإعلام EF Core أن هذه الخاصية لا يجب أن يتم إنشاؤها كعمود في قاعدة البيانات.


using System.ComponentModel.DataAnnotations.Schema;

public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }

    [NotMapped]
    public string ComputedValue { get; set; }
}

في هذا المثال، الخاصية ComputedValue ستظل موجودة داخل الكود ولكن لن يتم إنشاء عمود لها في قاعدة البيانات.

🔹 [ConcurrencyCheck] - التحقق من التزامن

تُستخدم خاصية [ConcurrencyCheck] لضمان أن السجل لم يتم تعديله بواسطة مستخدم آخر أثناء تعديلك له. إذا تغيرت القيمة في قاعدة البيانات أثناء تعديلك، سيتم إصدار استثناء (Exception).


using System.ComponentModel.DataAnnotations;

public class Product
{
    public int Id { get; set; }

    [ConcurrencyCheck]
    public string Name { get; set; }
}

أي تعديل على الخاصية Name سيتم التحقق منه قبل الحفظ لضمان عدم وجود تعارضات.

🔹 [Timestamp] - استخدام الطابع الزمني لمراقبة التزامن

تُستخدم خاصية [Timestamp] لمراقبة التزامن باستخدام حقل بايت خاص (عادة ما يكون صفيف بايتات).


using System.ComponentModel.DataAnnotations;

public class Product
{
    public int Id { get; set; }

    [Timestamp]
    public byte[] RowVersion { get; set; }
}

الخاصية RowVersion يتم تحديثها تلقائيًا مع كل تعديل، وأي محاولة لحفظ نسخة قديمة ستنتج عنها خطأ تزامن.

🔹 [Index] - إنشاء فهارس لتحسين الأداء

في الإصدارات الحديثة من EF Core (ابتداءً من EF Core 5.0)، يمكنك استخدام خاصية [Index] لإنشاء فهارس على الأعمدة لتحسين أداء الاستعلامات.


using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;

[Index(nameof(Name))]
public class Product
{
    public int Id { get; set; }

    public string Name { get; set; }
}

هذا الكود سيُنشئ فهرس (Index) على عمود Name لتحسين سرعة البحث عليه.

🔹 الفرق بين [ConcurrencyCheck] و [Timestamp]

ConcurrencyCheck Timestamp
يطبق التحقق على خصائص محددة. يتتبع التغييرات على كامل السجل عبر حقل واحد.
يتطلب مقارنة القيم عند الحفظ. يتطلب مقارنة الطابع الزمني (RowVersion).

🔹 الخلاصة

توفر السمات المتقدمة مثل [NotMapped]، [ConcurrencyCheck]، [Timestamp]، و[Index] أدوات قوية لضبط الكيانات بمرونة ودقة عالية، مما يساعد على تحسين الأداء، إدارة التزامن، وضبط بنية قاعدة البيانات بشكل احترافي.

تعليقات

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

C# - Arrays

Entity Framework - ما هو ORM؟ ونبذة عن Dapper وNHibernate

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