سلام. چند وقتی بود که به این فکر میکردم که دقیقا توی DbContext ، داخل دو متد OnConfiguring و OnModelCreating ، چه چیز هایی قراره داره که ما عادت کردیم و base.OnModelCreating و base.OnConfiguring رو صدا میزنیم داخل overrride های خودمون مثل مثال زیر.
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { //some code base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { //some code base.OnModelCreating(modelBuilder); }
همیشه هم اینکه چرا داریم اینو مینویسیم برام سوال بود ولی هیچ وقت دنبالش نرفتم. امروز رفتم و سورس Ef Core ، کلاس DbContext رو نگاهی انداختم . (این لینک)
تصویر بخش مربوطه رو پایین میزارم براتون.
خب همونطور که می بیینید ، این دو تابع ، virtual هستن (به همین دلیل میتونیم اونا رو override کنیم) ولی نکته ای که برام جالب بود این بود که داخل این دو متد به صورت پیشفرض خالیه.
خب الان یک سوال بوجود میاد که اگر خالیه ، چرا ما عادت کردیم base رو صدا میزنیم وقتی هیچی توش نیست؟!
خب این نکته بخاطر امکان ارثبری کردن چند DbContext از هم دگ هست. بزارید با کد نشونتون بدم
خب توی مرحله اول ، یک کلاس که از DbContext ارث میبره ایجاد میکنیم. یک کلاس Person هم ایجاد میکنیم و داخل MainContext میایم و یک تنظیم ساده براش انجام میدیم. چون MainContext بالاترین لول از Context های ما هست ، نیاز به فراخوانی متد خودش در کلاس DbContext نداره پس Base.OnModelCreating رو صدا نمیزنیم.
حالا توی مرحله بعد ، دو کلاس دگ ایجاد میکنیم.
یک کلاس ChildContext که داره از MainContext ارث میبره و داخلش هم یک تنظیمات برای Book انجام میدیم. در اینجا ، base.OnModelCreating ، داره همین تابع رو در والد خودش یعنی MainContext صدا میزنه و تنظیمات اون رو اعمال میکنه. (حالا اینجا به خودمون بستگی داره که بخوایم این تنظیمات ، قبل از تنظیمات ChildContext قرار بگیره یا بعدش).
خب حالا اگر یک شی از ChildContext رو از DI بگیریم و به پراپرتی Database اون بریم و تابع EnsureCreate رو صدا بزنیم ، میتونیم با بریک پوینت ، نحوه فراخوانی شدن هارو ببینیم.
اگرم بخوایم از migration استفاده کنیم و ببینیم چی برامون تولید میکنه ، میتونیم از کامند زیر استفاده کنیم.
add-migration init -context childContext
خب بعد add-migration که نام اون migration رو دادیم . بعدشم مشخص میکنیم براش که از چه context ای استفاده کنه.
خب می بینید که نتیجه همون چیزیه که مطلوب ماست.
پس بطور کلی وقتی قراره یک Context توی برنامه خودمون داشته باشیم ، صدا زدن Base برای متد های OnConfiguring و OnModelCreating سودی به ما نمیرسونه.
موفق باشید
:)