خطأ في إعداد API فلوانت لعلاقة واحد لعدة مع EF Core
القواعد الأساسية لاستخدام Entity Framework Core في تطبيقات C#
تناول هذا المقال مشكلات تكوين التنقل بين الكيانات في إطار العمل "Entity Framework Core" باستخدام أسلوب البرمجة "Fluent API". حيث يواجه العديد من المطورين مشكلة تكوين العلاقات بين الكيانات عند إعداد العلاقات واحد إلى متعدد. يعتبر هذا الأمر جزءًا أساسيًا من تصميم قاعدة البيانات ويؤثر بشكل كبير على أداء التطبيق وتجربته. سنستعرض كيف يمكن التغلب على الخطأ المعروف باسم "Unable to configure navigation exception".
فهم الخطأ
يظهر الخطأ "Unable to configure navigation exception" عادةً نتيجة استخدام مجموعة من النوع IEnumerable
بدلاً من ICollection
. يتم تعريف IEnumerable
كواجهة لتكرار مجموعة بأكملها دون إمكانية تغيير محتوياتها، مما يجعل Entity Framework يعتبرها مجموعة للقراءة فقط. لذا، إذا حاولت استخدام IEnumerable
لتتبع التغييرات في عناصر قاعدة البيانات، سوف تواجه مشكلات.
حل المشكلة باستخدام ICollection
لحل هذه المشكلة، يجب عليك تحويل الخصائص الممثلة للعلاقة بين الكيانات إلى نوع ICollection
. يتيح لك استخدام ICollection
إمكانيات تعديل المحتوى، مما يمكّن Entity Framework من تعقب التغييرات بشكل سليم. لنلقِ نظرة على الأمثلة والتطبيقات الممكنة:
public class MyParent
{
public Guid Id { get; set; }
public Guid MyChildId { get; set; } // خاصية المفتاح الخارجي
public MyChild Child { get; set; } // الخاصية المرجعية إلى MyChild
}
public class MyChild
{
public Guid Id { get; set; }
public ICollection<MyParent> Parents { get; set; } = new List<MyParent>(); // تنقل المجموعة إلى كائنات MyParent ذات الصلة
public ICollection<MyChildParameter> Parameters { get; set; } = new List<MyChildParameter>(); // نفس الشيء بالنسبة للمعلمات
}
public class MyChildParameter
{
public Guid Id { get; set; }
public string Value { get; set; }
public Guid MyChildId { get; set; } // خاصية المفتاح الخارجي
public MyChild MyChild { get; set; } // خاصية مرجعية إلى MyChild
}
تحديد العلاقات باستخدام Fluent API
بعد تعديل النموذج، يجب أن نحدد العلاقات بين الكيانات باستخدام "Fluent API". يمكنك ذلك من خلال إعداد المفتاح الخارجي وسلوك الحذف:
modelBuilder.Entity<MyChildParameter>()
.HasOne(childParameter => childParameter.MyChild)
.WithMany(myChild => myChild.Parameters)
.HasForeignKey(childParameter => childParameter.MyChildId)
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
بهذه الطريقة، ستتمكن من تكوين العلاقات بشكل صحيح، مما يُسهم في تجنب الاستثناءات المتعلقة بالتنقل.
استخدام الكلمة الرئيسية الافتراضية
إذا كنت تحتاج إلى دعم تحميل الخصائص بشكل بطيء من قبل Entity Framework، ينبغي عليك تعريف الخصائص كالتالي:
public virtual ICollection<MyParent> Parents { get; set; } = new List<MyParent>();
public virtual MyChild MyChild { get; set; }
هذا سيساعد في تحسين أداء التطبيق ويضمن إجراء العمليات بشكل سلس.
الخلاصة
يمكن تلخيص الحلول المتاحة لمشكلة "c# – Unable to configure navigation exception when setting up fluent API notation one-to-many with EF Core code-first" من خلال استخدام ICollection
كبديل لـ IEnumerable
. يعد هذا التغيير البسيط ولكنه ضروري لتحقيق تجربة تطوير أكثر سلاسة وضمان تعقب التغييرات بشكل فعل.
تساعدك هذه الممارسات في تجنب الكثير من المشكلات التي قد تواجهها أثناء تطوير تطبيقات باستخدام Entity Framework Core، مما يمنحك الوقت للتركيز على جوانب أخرى من تطوير برنامجك. فهم العلاقات والتأكد من تكوينها بشكل صحيح هو أساس بناء تطبيقات قاعدة البيانات الناجحة.
إذا كان لديك أي استفسارات أو تحتاج إلى المزيد من التفاصيل، فلا تتردد في البحث في الوثائق الرسمية أو طرح الأسئلة في المجتمعات الخاصة بالمطورين.