دوره آموزش جامع Entity Framework روش های Initialize دیتابیس در Code First

گروه نرم افزاری هیلتن
گروه نرم افزاری هیلتن
392 بار بازدید - 3 سال پیش - در قسمت قبلی وقتی میخواستیم
در قسمت قبلی وقتی میخواستیم یک کدی رو تغییر بدیم بعدش حتما باید دیتابیس رو پاک میکردیم و از اول برنامه رو اجرا میکردیم تا اون تغییراتی که رو کدها اعمال کرده بودیم روی دیتابیس اعمال بشن اما اینکار کار درستی نیست . تو این قسمت در اینباره حرف خواهیم زد که چگونه بدون پاک کردن دیتابیس تغییرات اعمال بشن.راهکارهایی که برای اینکار هست اینه که مثلا وقتی که برنامه اجرا میشه ، دیتابیس خودبخود حذف بشه یا اینکه وقتی روی مدل تغییر ایجاد کردید دیتابیس خودبخود حذف بشه یا اینکه کلا مدل وجود نداشت ، دیتابیس حذف بشه یا راهکارهای دیگه که خواهیم گفت. حالا واسه شروع کار میریم سراغ روش اول یعنی وقتی مدل مون ساخته شد ، دیتابیس مون حذف بشه . برای اینکار میریم داخل کلاس سازنده ی مدل مون و داخلش از کد DropCreateDatabaseAlways استفاده میکنیم چون وقتی که از این مدل مون یک آبجکت ساخته شد بیاد و یکبار سازنده رو اجرا کنه (کدهای درون سازنده رو اجرا کنه) روش دوم نیز دقیقا شبیه روش اول هست با این تفاوت که توش میگه اگر مدل مون تغییر کرد ، دیتابیس رو حذف کن و بساز (اینجا منظور از مدل همون کد هست) برای اینکار میریم داخل کلاس سازنده ی مدل مون و داخلش بجای استفاده از DropCreateDatabaseAlways از کد DropCreateDatabaseIfModelChanges استفاده میکنیم یعنی اگر مدل مون تغییر کرد ، دیتابیس رو حذف کن و بساز. تو روش سوم هم از کد CreateDatabaseIfNotExists اگر دیتابیس وجود نداشت ، دیتابیس رو بساز.این کد بصورت پیشفرض روی انتیتی فریمورک وجود داشت چون وقتی دیتابیس وجود نداشت ما برنامه رو اجرا میکردیم (یک تابع رو فراخونی میشد) ، دیتابیس خودبخود ایجاد میشد. حالا در قدم اول از روش اول استفاده میکنیم یعنی روش DropCreateDatabaseAlways همیشه دیتابیس رو موقع اجرا پاک کن و دوباره بساز.فقط اینجا حتما دقت کنید که ما از قبل تو دیتابیس یک رکورد داشتیم. برنامه رو اجرا میکنیم و روی دکمه get میزنیم ، چون از روش اول یعنی DropCreateDatabaseAlways استفاده میکنیم موقع اجرا چه دیتابیس وجود داشته باشه چه وجود نداشته باشه ، در هر صورت دیتابیس پاک میشه و دوباره ساخته میشه به همین دلیل اون رکورد قبلی که از قبل تو دیتابیسمون وجود داشت هم پاک میشه و دیگه داخل دیتابیسی که جدید ساخته شده این رکورد وجود نداره و این یک مشکل خیلی بزرگ هست ، اینکه ما این کدها رو داخل سازنده نوشتیم خیلی کار اشتباهی هست چون اگه بخوایم یک رکورد جدید وارد کنیم دیتابیس حذف میشه و دوباره ساخته میشه و اطلاعات و رکوردهایی که قبل تر تو دیتابیس ذخیره شده بودند پاک میشن و از دست میرن همچنین اگه یک رکورد رو آپدیت کنیم دیتابیس حذف میشه اگه یک رکورد رو حذف کنیم دیتابیس حذف میشه و فرقی نمیکنه که چه اکشنی رو انجام بدید چون با فراخوانی یکی از متدهایی که داخل مدل مون هست ابتدا سازنده مدل اجرا میشه و این کار رو خراب میکنه به همین دلیل این کدها نباید داخل سازنده باشن و از داخل سازنده پاکشون میکنیم چون بهتره فقط یکبار اجرا بشن. برای رفع این مشکل چه باید کرد؟ اگر یادتون باشه در مبحث شئ گرایی یک سازنده دیگه به نام سازنده استاتیک داشتیم که وقتی که اولین آبجکت از این کلاس (یعنی مدل مون) ساخته بشه آنوقت این سازنده تنها یکبار اجرا میشه و دیگه بعد از اون اجرا نمیشه بنابراین یک سازنده استاتیک مینویسیم و کدهایی که تو سازنده قبلی پاک کردیم ، اینجا داخل سازنده استاتیک مینویسیم.یعنی بار اولی که آبجکت ساخته شد این کلاس سازنده تنها یکبار اجرا میشه و دفعات بعدی که آبجکت ساخته شد دیگه اجرا نمیشه به عبارت دیگه برای مثال وقتی برنامه رو برای اولین بار اجرا کردیم و مثلا insert کردیم ، سازنده یکبار اجرا میشه و بنابراین دیتابیس پاک و دوباره ساخته میشه ولی اگر دوباره از متدهای دیگه مثل Update یا Delete استفاده کنیم دیگه دیتابیس مجددا پاک نمیشه چون هنگام ساخت اولین آبجکت از مدل ، سازنده استاتیک یکبار اجرا خواهد شد و دیگه اجرا نمیشه.اما بهتره از روش دومی استفاده کنید یعنی DropCreateDatabaseIfModelChanges هر وقت مدل تغییر کرد دیتابیس ایجاد بشه که باعث افزایش سرعت میشه. یک روش دیگه ای هم که هست اینه که شما میتونید بر حسب نیاز و سلیقه شخصی تون این کدها رو کاستوم کنید مثلا هر وقت کد تغییر کرد اول یک بکاپ از دیتابیس گرفته شود و بعد دیتابیس حذف و ایجاد شود.
3 سال پیش در تاریخ 1400/02/11 منتشر شده است.
392 بـار بازدید شده
... بیشتر