
آموزش 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 استفاده کنیم.































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