#migration #codeFirst #DatabaseFirst #ModelFirst در روش code first اول میومدیم با استفاده از کلاس های C# برنامه رو درست میکردیم و بعد با migration تبدیلش میکردیم به دیتا بیس. روش database first اینجا اول دیتا بیس رو طراحی میکردیم و بعد با ef core میومدیم ازش استقاده میکردیم . روش اخر هم model first بود که زیاد استقبال ازش نشد. توی ورژن های ef core جدید دیگه دو روش 2 و 3 حذق شدن و فقط مورد 1 وجود داره ، حالا اگر یه دیتا بیسی داشتیم که از قبل بوده و میخوایم ازش استفاده کنیم میایم از databaseFirst استفاده میکنیم

اینجا یه جورایی دیتابیس و روش استفاده اش رو میکنه code first

استفاده کردن از روش database first خطرناکه چون اگر جایی از پروسه ی ساخت اتفاقی بیوفته و طرح دیتابیس شما ازش چیزی کم یا زیاد بشه یا تغییر کنه کل منطق برنامه از بین میره برای همین از این روش در طراحی استفاده نشود

مگر این که یه دیتا بیسی باشه از قبل و حالا باید براش برنامه بنویسید اینطوری میشه ازش استفاده کرد

روش script توی این روش efcore میاد و برامون اسکریپت SQL تولید میکنه و میتونیم ازش توی محیط production استفاده کنیم. یه روش دیگه هم هست به اسم ensure created که میاد بر اساس entity هامون دیتا بیس ساخته میشه ، از این روش پیشنهاد میشه استفاده نشه و فقط برای محیط تست مناسبه

اگر بخوایم ورژنی رو نصب کنیم که توی حالت preview هستش باید به سایت nuget بریم

دقت کنید که برای migiration از این پکیج هم باید استفاده کنیم #migration #EntityFrameworkCore_tool

#scaffolding اولی از سمت چپ میشه آدر دیتا بیس دومی میشه اسمش سومیش دیفالت همونه اینجا ما اومدیم و یه connection stream برقرار کردیم ولی خوب برنامه هنوز نمیدونه که این از چه نوع دیتا بیسی هستش اینجا باید براش provider اش رو براش تعیین کنیم که اینجا برای ما sql server هستش خوب حالا اینطوری

#outputDir اینجا اومدیم مدل sql server رو هم بهش گفتیم و بعد گفتیم که از روی دیتا بیس بیاد اون entity هایی که درست کرده رو بریزه توی پوشه ی Models با استفاده از outputDir کلاس dbContext رابط بین دیتا بیس و برنامه ما هستش

خوب اگر بخوایم رابطی برای دیتا بیس در نظر داشته باشیم باید از کلاس dbcontext ارث بری کنیم بعد برای این که از روی entity که داریم بریم توی دیتابیس رو بسازیم میتونیم از dbset استفاده کنیم، بعد باید بهش بگیم توی کدوم دیتا بیس با چه provider ای برو این کار رو بکن بعد با این دستور زیر توی ترمینال میایم migiration رو انجام میدیم

اون init اسمیه که براش در نظر گرفتیم

دقت کنید که اون جایی که داریم توی ترمینال میزنیم باید همونجایی باشه که میخوایم migration انجام بشه

یه نکته ی دیگه این که اون پروژه ای رو هم که داریم روش کار میکنیم باید set as start project باشه #set_as_startup_project #multiple_project

و دقت کنید که حتما اون چیزی که دارید به دیتا بیس وصل میکنید هم وصل باشه به پروژه

خوب حالا توی migiration ها دو تا متد وجود داره

اولیش برای درست کردن جدول هاست و دومی برای حذفش هستش خوب حالا ممکنه پیش بیاد که migiration اشتباه انجام دادیم و میخوایم برگردیم به migiration های قبلی توی فایل dot designer هم اومده کانفیگ پیشنهادی رو برای کلاسمون در نظر گرفته و نوشته با دستور #migration

میتونیم migiration رو توی دیتابیس وارد کنیم

نکته ای که وجود داره اینه که اگر بخوایم migiration رو حذف کنیم یاید از این جدول هم حذف بشه

و تغییرات و لیست migiration های قبلی هم اینجا هست

ببنید هر وقت که تغییری ایجاد کردیم اول باید add migiratio رو بزنیم تا migiration فایلش ایجاد بشه و درست بشه و بعد با update میزنیم اون رو روی دیتا بیس اعمال میکنه خوب یه نکته ای که هست اینه که تمامی دستورات sql توی ef core نیستش برای همین توی خودش یه دستوری داره که میتونیم توش t-sql و دستورات sql رو بنویسیم

اینجا توی اون پرانتزه دستورات رو مینویسیم و در موقع ساخت دیتا بیس اعمال میشه

خوب حالا چند تا نکته ی دیگه هم هست

migration_CLI اینجا اگر بخوایم توضیح بدیم اینطوری میشه که بعد از add-migiration اسمی که برای این migiration انتخاب کردیم یا کاری که این migiration انجام میده رو مینویسیم و بعد میایم به جای این که دستی بریم پروژه رو روی روی set as startup کنیم اینجا با کد این کار رو میکنیم و بعد میایم اسم اون پروژه رو مینویسیو بعد میایم dependency که داره رو هم مینویسیم و بعدش میایم اون فولدری رو که میخواد فایل های این migiration ریخته بشه رو هم تعیین میکنیم

حالا وقتی که up , down خالیه یعنی این که ما هیچ تغییراتی رو اعمال نکردیم

با این دستور آخرین migiration رو حذف میکنیم نمیتونیم دو تا فولدر جدا داشته باشیم برای migiration ها هر وقت بخوایم برگردیم به یه migiration قبلی و بعد رو ها رو پاک کنیم کافیه که بیایم اسم اون migiration قبلی رو بنویسیم

خوب بعدش اگر migiration جلوتری بودی میتونیم با remove migiration پاکش کنیم

#script_migration خوب اینجا اتفاقی میوفته اینه خوب حالا بعدش بهمون یه اسکریپت میده که میریم اون اسکریپته رو دستی میزنیم توی دیتا بیس

خوب حالا یه سری ابزار هم هستن که میتونید فقط اون تغییراتی که اعمال کردید روی دیتا بیستون رو از اون اسکریپته شناسیی کنید و اون رو فقط اعمال کنید

این یه راحیه که بتونیم فقط اسکریپت که مرتبط با entity که به طور مثال جدید ساختمیش بهمون میده و میتونیم ازش استفاده کنیم

یادمون باشه که وقتی که تغییر رو انجام دادیم باید update بزنیم روی اون migration قبل از تغییر و وقتی که script - migration userentity رو میزنیم برامون تغییرات رو نشون میده میتونیم براش یه بازه رو هم در نظر بگیریم که فقط همون رو بهمون script بده

حالا اگر چند تا دیتا بیس داشتیم اینطوری بهش دسترسی پیدا میکنیم

همونطوری که میبینید توی این حالت برای migrate کردن باید بهش context رو هم بدیم که میشه اسم همون کلاسی که قراره از طریق اون به دیتا بیس وصل بشیم اگر id اطلاعاتی که میخوایم یکسان باشه میتونیم چند تا دیتا بیس داشته باشیم مثلا با یک آی وصل بشیم یه یه دیتا بیس برای خواندن اطلاعات و مشخصات فردی و بعد با همون آی دی وصل بشیم به یه دیتا بیس دیگه برای گرفتن یه سری اطلاعات دیگه مثلا خرید و فروش های من

برای این که اولین migiration رو بخوایم پاک کنیم از این دستور استفاده میکنیم :

خوب حالا اگر چند تا دیگه migiration بود اول میریم روی migiration قبلی و بعد میزنیم remove

https://stackoverflow.com/questions/39001525/entity-framework-the-migrations-configuration-type-was-not-be-found-in-the-ass