وراثت یا Inheritance در EF Core ابزاری قدرتمند برای مدلسازی مفاهیم پیچیده، کاهش تکرار، و افزایش خوانایی و توسعهپذیری پروژههاست. و در آموزش جامع Inheritance در EF Core و Asp.Net Core، با استفاده از مثال واقعی و با استراتژی TPH با Inheritance آشنا میشوید.
وراثت یا Inheritance در EF Core به معنای پیادهسازی ساختارهای شیءگرا در سطح پایگاهداده است که به ما اجازه میدهد کلاس پایهای مانند Contract تعریف کرده و کلاسهای مشتق مثل MobileContract و TvContract از آن ارثبری کنند. EF Core این ساختار را با سه استراتژی TPH (ذخیره تمام کلاسها در یک جدول با ستون Discriminator)، TPT (ایجاد جدول جدا برای هر کلاس) و TPC (ایجاد جدول فقط برای کلاسهای مشتق) پشتیبانی میکند. این ویژگی باعث میشود کد ما منظمتر، قابل نگهداریتر و نزدیکتر به اصول طراحی شیءگرا باشد، در حالی که EF Core بهطور هوشمند نحوه نگهداری دادهها را در دیتابیس مدیریت میکند.
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 در کلاس پایه استفاده شد؟
public DbSet<Contract> Contracts { get; set; }
public DbSet<MobileContract> MobileContracts { get; set; }
public DbSet<TvContract> TvContracts { get; set; }
modelBuilder.Entity<Contract>()
.HasDiscriminator<string>("ContractType")
.HasValue<MobileContract>("Mobile")
.HasValue<TvContract>("TV");
در زمان کدنویسی ما جدولی با نام Contract نداریم و برای کدنویسی میتوانیم از مقدار MobileContract و TvContract استفاده کنیم.
در دیتابیس جدولی با نام MobileContract و TvContract نداریم و فقط یک جدول داریم و نام آن هم Contract است.
به طور مثال میتوانیم ویو مدلی با نام TVContractVmnhaji fhadl. و شامل مقادیر جدول پایه و جدول مشتق شده باشد.
از آنجایی که به MobileContract و TvContract دسترسی داریم پس به راحتی میتوانیم از AutoMapper استفاده کنیم.