همانطور که میدانید ORM ها به ما امکان را میدهند تا معادل کلاس های برنامه، در دیتابیس جدول ایجاد کنیم
این کار به سادگی توسط EfCore قابل پیاده سازی است و در بحث امروز ما نیست اما برخی از موارد هستند که پیاده سازی آنها به این سادگی نیست و پیچیدگی خاص خود را دارد از جمله این موارد بحث وراثت می باشد.
نکته : پیش نیاز این مقاله آشنایی با EntityFramework Core می باشد.
در OOP ما از امکاناتی بهره میبریم که کار با object ها را ساده تر میکنند و پیچیدگی کار را کاهش میدهد اما همه ی مواردی که در OOP هستند به سادگی قابل پیاده سازی در دیتابیس نیست و پیاده سازی آن ، نیاز به استفاده از تکنیک های مختلف دارد.
کلاس زیر را در نظر بگیرید:
حال دو کلاس دیگر ایجاد میکنیم که از Person ارث بری میکنند و دارای فیلد های متفاوتی هستند:
در ادامه هر سه کلاس ایجاد شده را به AppDbContext اضافه میکنیم:
برای پیاده سازی این حالت در دیتابیس سه الگو وجود دارد که در ادامه به آنها میپردازیم:
الگوی TPH: نام کامل آن Table-per-hierarchy میباشد که به اختصار به آن TPH میگویند ، در این روش تمامی کلاس های مشتق شده از کلاس پایه و خود کلاس پایه را به صورت یک جدول ایجاد میکند و با ستون "Discriminator" اطلاعات این کلاس ها را از یکدیگر متمایز میکند، این رفتار پیش فرض Ef میباشد.
به تصویر زیر توجه کنید:
همانطور که در تصویر بالا مشاهده میکنید برای سه کلاس person , teacher , student تنها یک جدول با نام People ایجاد شده است. در ادامه برای هر جدول کمی دیتا وارد میکنیم تا با ساختار آن در دیتابیس و نقش Discriminator بیشتر آشنا شویم.
در تصویر بالا به سادگی میتوان عملکرد TPH را مشاهده کرد ، همانطور که مشاهده میکنید در ستون Discriminator نام کلاس ها ذخیره شده است و میتوانید به راحتی تفکیک کنید و همینطور بقیه ستون هایی که در آن کلاس قرار ندارند در حالت null قرار می گیرند.
الگوی TPT: این روش به ازای هر کلاس یک جدول جداگانه در نظر میگیریم و ستون های هر جدول به صورت مجزا طراحی میگردد ، برای پیاده سازی این روش کافیست در کلاس ApplicationDbContext ، متد OnModelCreating را override کنیم و در آن کلاس پدر را با الگوی TPT معرفی کنیم:
سپس دیتابیس را ایجاد میکنیم و مقداری دیتا وارد میکنیم:
همانطور که مشاهده میکنید جداول ایجاد شده به صورت مجزا میباشد ولی Id آنها از ادامه ی جدول پدر یعنی Person می باشد و یک ردیف خالی در کلاس پدر ایجاد میشود. برای دریافت اطلاعات کلاس پدر نیاز به join زدن داریم در بسیاری از موارد الگوی TPT سرعت کمتری نسبت به TPH دارد.
الگوی TPC : این الگو که در Ef 7 معرفی شده است همانند TPT سه جدول مجزا ایجاد میکند با این تفاوت که جداول فرزند دارای فیلد های جدول پدر هستند برای پیاده سازی این الگو همانند TPT کافیست همانند تصویر پایین از UseTpcMappingStrategy استفاده کنیم.
سپس دیتابیس را آپدیت کرده و تغییرات را می توانید در تصویر زیر مشاهده نمایید.
این سه الگو دارای جزئیات و کانفیگ های متعددی می باشند که پرداختن به تک تک آنها در این مقاله نمیگنجد ، همچنین از نظر Performance دارای تفاوت هایی هستند ولی در کل عملکرد الگوی TPH از بقیه بهتر می باشد.