آموزش Inheritence در EF Core

وراثت یا Inheritance در EF Core ابزاری قدرتمند برای مدل‌سازی مفاهیم پیچیده، کاهش تکرار، و افزایش خوانایی و توسعه‌پذیری پروژه‌هاست. و در آموزش جامع Inheritance در EF Core و Asp.Net Core، با استفاده از مثال واقعی و با استراتژی TPH با Inheritance آشنا میشوید.

مفهوم Inheritance در EF Core

وراثت یا Inheritance در EF Core به معنای پیاده‌سازی ساختارهای شی‌ء‌گرا در سطح پایگاه‌داده است که به ما اجازه می‌دهد کلاس پایه‌ای مانند Contract تعریف کرده و کلاس‌های مشتق مثل MobileContract و TvContract از آن ارث‌بری کنند. EF Core این ساختار را با سه استراتژی TPH (ذخیره تمام کلاس‌ها در یک جدول با ستون Discriminator)، TPT (ایجاد جدول جدا برای هر کلاس) و TPC (ایجاد جدول فقط برای کلاس‌های مشتق) پشتیبانی می‌کند. این ویژگی باعث می‌شود کد ما منظم‌تر، قابل نگهداری‌تر و نزدیک‌تر به اصول طراحی شی‌ء‌گرا باشد، در حالی که EF Core به‌طور هوشمند نحوه نگهداری داده‌ها را در دیتابیس مدیریت می‌کند.

چرا باید ازInheritance در EF Core استفاده کنیم؟

  • کاهش تکرار کد (DRY Principle)
  • ساختاردهی بهتر به مدل‌های دامنه
  • تسهیل توسعه و نگهداری پروژه
  • هماهنگی با اصول OOP و SOLID
  • پشتیبانی مستقیم EF Core از وراثت
  • امکان ایجاد API و ViewModelهای تمیزتر

استراتژی های Inheritance در EF Core

  • یک جدول برای تمام کلاس‌های وراثتی یا TPH که مخفف Table Per Hierarchy میباشد. تمام داده‌های کلاس پایه و کلاس‌های مشتق در یک جدول واحد ذخیره می‌شود، با یک ستون جداکننده (Discriminator) برای تشخیص نوع رکورد. از مزایای آن میتوان به سریع‌ترین عملکرد، ساده‌ترین پیاده‌سازی، یک جدول واحد اشاره کرد. و از معایب آن میتوان به ستون‌های اضافی برای کلاس‌های غیرمرتبط، ممکن است null زیاد باشد اشاره کرد.
  • یک جدول جدا برای هر کلاس از زنجیره‌ی وراثت یا TPT که مخفف Table Per Type میباشد. هر کلاس یک جدول جداگانه دارد. هر کلاس (چه پایه و چه مشتق) یک جدول جداگانه ساخته می‌شود، و داده‌ها با استفاده از JOIN به هم متصل می‌شوند. از مزایای آن میتوان به ساختار دیتابیس منعطف‌تر، بهینه برای گزارش‌گیری اشاره کرد. و از معایب آن میتوان به کندی عملکرد به‌خاطر JOIN زیاد، پیچیدگی در کوئری‌ها اشاره کرد.
  • جدول برای هر کلاس مشتق قابل نمونه‌سازی یا TPC که مخفف Table Per Concrete Type میباشد. فقط برای کلاس‌های مشتق (concrete classes) جدول ساخته می‌شود. کلاس پایه جدول ندارد. داده‌ها به‌صورت مستقل در هر جدول ذخیره می‌شوند. از مزایای آن میتوان به عدم وجود null و ستون‌های بی‌ربط، سریع برای کلاس خاص اشاره کرد. و از معایب آن میتوان به داده‌ها تکراری می‌شوند، عدم پشتیبانی از shared logic در SQL، تا EF Core 5 پشتیبانی نمی‌شد اشاره کرد.

مدل Contract

public abstract class Contract
{
    public int Id { get; set; }
    public required string CustomerName { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
}

public class MobileContract : Contract
{
    public bool Has5G { get; set; }
}

public class TvContract : Contract
{
    public bool HasSportsPackage { get; set; }
}

چرا از abstract در کلاس پایه استفاده شد؟

  • جلوگیری از ساختن نمونه (Instance) مستقیم
  • جلوگیری از ذخیره رکورد بدون نوع مشخص
  • پشتیبانی بهتر EF Core از TPH در حالت abstract

تنطیمات DbSet در DatabaseContext

public DbSet<Contract> Contracts { get; set; }
public DbSet<MobileContract> MobileContracts { get; set; }
public DbSet<TvContract> TvContracts { get; set; }

تنطیمات Fluent Api در DatabaseContext

modelBuilder.Entity<Contract>()
.HasDiscriminator<string>("ContractType")
.HasValue<MobileContract>("Mobile")
.HasValue<TvContract>("TV");

در زمان کدنویسی ما جدولی با نام Contract نداریم و برای کدنویسی می‌توانیم از مقدار MobileContract و TvContract استفاده کنیم. در دیتابیس جدولی با نام MobileContract و TvContract نداریم و فقط یک جدول داریم و نام آن هم Contract است. به طور مثال میتوانیم ویو مدلی با نام TVContractVmnhaji fhadl. و شامل مقادیر جدول پایه و جدول مشتق شده باشد. از آنجایی که به MobileContract و TvContract دسترسی داریم پس به راحتی می‌توانیم از AutoMapper استفاده کنیم.

مشاهده در آپارات یا یوتیوب

محتوای ویدیویی این صفحه در سایت قابل مشاهده است. اما اگر عادت دارید توی پلتفرم آپارات یا یوتیوب ویدیوها را مشاهده کنید، می‌توانید از دکمه‌های زیر استفاده کنید.

تماشای ویدیوی آموزش Inheritence در EF Core در آپارات و یوتیوب

اشتراک‌گذاری با یک کلیک

با یک کلیک، محتوای این صفحه را در شبکه‌های اجتماعی، ایمیل یا پیام‌رسان‌های مورد علاقه‌تان به‌سرعت به اشتراک بگذارید.

اشتراک‌گذاری صفحه آموزش Inheritence در EF Core در شبکه‌های اجتماعی

نظرات شما برای ما ارزشمند است

متاسفانه تاکنون پیامی برای این مطلب ثبت نشده است. شما اولین شخصی باشید که پیام می‌گذارد.

نظرات کاربران

فرم افزودن دیدگاه

با ارسال نظرات خود ما را در ایجاد محتوای بهتر کمک کنید.

با خدمات تهران آی تی آشنا شوید

تهران آی تی با افتخار خدمات زیر را ارائه می‌دهد.