Entity Framework - Fluent API Complex Types (Owned Entities)
9.7 Entity Framework - شرح Complex Types (Owned Entities)
في بعض الأحيان، نحتاج إلى تخزين مجموعة خصائص مرتبطة ببعضها في نفس الجدول بدون إنشاء جدول منفصل لها. هنا يظهر مفهوم Owned Entities أو ما يُعرف أحيانًا بـComplex Types، وهي ميزة قوية جدًا في Entity Framework Core.
🔹 ما هو Owned Entity؟
Owned Entity هو كيان (Entity) يتم ربطه بشكل كامل بكائن آخر (المالك - Owner)، ويتم تخزين خصائصه داخل نفس جدول الكائن المالك، وليس في جدول مستقل.
بمعنى آخر: - لا يتم إنشاء جدول جديد للـ Owned Entity. - يتم دمج خصائصه مع خصائص الكيان الأساسي في نفس الجدول.
🔹 مثال عملي على Owned Entities
افترض لدينا كيان Customer يحتوي على عنوان Address مكوّن من عدة خصائص مثل: Street وCity وCountry.
// الكلاس المملوك
public class Address
{
public string Street { get; set; }
public string City { get; set; }
public string Country { get; set; }
}
// الكيان الرئيسي
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
}
🔹 كيفية تعريف Owned Entity باستخدام Fluent API
نستخدم الدالة OwnsOne() لتعريف الكيان المملوك:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>(entity =>
{
entity.OwnsOne(c => c.Address);
});
}
بذلك سيتم إنشاء جدول Customers يحتوي على أعمدة لكل من:
- Id
- Name
- Address_Street
- Address_City
- Address_Country
🔹 تخصيص خصائص Owned Entity
يمكنك تخصيص خصائص الـ Owned Entity باستخدام Fluent API أيضاً:
modelBuilder.Entity<Customer>(entity =>
{
entity.OwnsOne(c => c.Address, address =>
{
address.Property(a => a.Street)
.HasMaxLength(200);
address.Property(a => a.City)
.HasMaxLength(100);
});
});
هنا قمنا بتحديد أطوال الأعمدة Address_Street وAddress_City.
🔹 خصائص هامة عن Owned Entities
- لا يمكن للـ Owned Entity أن يعيش بمفرده، دائمًا مرتبط بالمالك.
- يتم حذف الـ Owned Entity تلقائيًا عند حذف الكيان المالك.
- يمكنك أن تملك أكثر من Owned Entity داخل نفس الكيان.
🔹 الخلاصة
استخدام Owned Entities طريقة رائعة لتنظيم البيانات المرتبطة داخل الجداول بطريقة نظيفة وفعالة، وتمنحك مرونة عالية في تصميم قاعدة بياناتك دون الحاجة إلى إنشاء جداول إضافية لكل مجموعة خصائص مرتبطة.
تعليقات
إرسال تعليق