البرمجة

تخزين قوائم السلاسل في EF Core: نوع بيانات مخصص دون تعقيد

في سياق تطوير تطبيقات ASP.NET Core باستخدام Entity Framework Core، قد يطرأ تحدي على المطورين عند محاولة تخزين قائمة من السلاسل باستخدام EF Core Code First في قاعدة بيانات علاقية مثل SQL Server. في هذا المقال، سنناقش الطرق الممكنة لتحقيق ذلك بدون الحاجة إلى إنشاء فئة Wrapper إضافية، ونركز على الحفاظ على بساطة نموذج الدومين دون التأثير الكبير من وجود طبقة الإنتاج.

إحدى الطرق الممكنة هي استخدام نوع بيانات مخصص (Custom Data Type) في EF Core. يمكننا إنشاء نوع بيانات مخصص لتمثيل القائمة من السلاسل. على سبيل المثال، يمكننا تعريف نوع بيانات مخصص يسمى StringListType كالتالي:

csharp
public class StringListType : List<string> { // يمكنك إضافة المزيد من السلوك إذا لزم الأمر }

ثم، يمكننا استخدام هذا النوع المخصص في الكلاس Entity كما يلي:

csharp
public class Entity { public StringListType SomeListOfValues { get; set; } // Other code }

وعند تكوين EF Core لاستخدام النوع المخصص، سيقوم بتتبع الإطار المستند إلى الكود بشكل تلقائي وتخزين القيم بشكل صحيح في قاعدة البيانات.

في سياق تكوين السمة في DbContext، يمكنك استخدام الكود التالي:

csharp
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .Property(e => e.SomeListOfValues) .HasConversion( v => JsonConvert.SerializeObject(v), v => JsonConvert.DeserializeObject(v) ); }

يُستخدم هنا JsonConvert من مكتبة Newtonsoft.Json لتحويل القائمة إلى سلسلة JSON عند التخزين واسترجاعها عند الاستعلام.

باستخدام هذا النهج، يمكنك تخزين القائمة من السلاسل في قاعدة البيانات دون الحاجة إلى إضافة فئة Wrapper. يتيح لك هذا النهج الابتعاد عن تعقيدات النموذج الدوميني والتركيز على الجوانب الأساسية للتطبيق.

المزيد من المعلومات

بالطبع، دعنا نستكمل النقاش بمزيد من المعلومات حول استخدام نوع بيانات مخصص لتمثيل قائمة السلاسل في Entity Framework Core.

في السياق الحالي، قد تكون فكرة استخدام نوع بيانات مخصص هي خطوة في الاتجاه الصحيح للحفاظ على بساطة نموذج الدومين. تجنب إضافة فئة Wrapper يمكن أن يسهم في تبسيط هيكل البيانات وتحسين قابلية الصيانة.

عند استخدام نوع بيانات مخصص، يمكنك أيضاً الاستفادة من ميزات أخرى في Entity Framework Core مثل التحويل (Conversion). في المثال السابق، تم استخدام تحويل JSON لتخزين واسترجاع البيانات. ومع ذلك، يمكن تكوين النوع المخصص بطرق أخرى حسب احتياجات التطبيق.

على سبيل المثال، إذا كنت ترغب في تخزين السلاسل في قاعدة البيانات كقائمة فرعية (Subcollection)، يمكنك تعريف النوع المخصص بهذه الطريقة:

csharp
public class StringListType : List<string> { // أي مزيد من السلوك المخصص }

وفي DbContext:

csharp
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity() .OwnsOne(e => e.SomeListOfValues, list => { list.HasData("Value1", "Value2", "Value3"); }); }

في هذا السيناريو، يقوم OwnsOne بتعريف القائمة ككائن “مملوك” (Owned Entity) دون الحاجة إلى تحويل JSON، مما يتيح لك تخزين البيانات بطريقة هيكلية أكثر.

بهذه الطريقة، يمكن تحقيق هدف الاحتفاظ ببساطة نموذج الدومين وتحقيق تأثير فعّال في التخزين باستخدام Entity Framework Core.

زر الذهاب إلى الأعلى