Database Initializer در روش Entity Framework Code-First

چهارشنبه 27 آبان 1394

در این مقاله راجع به Database Initializer در روش Entity Framework Code-First توضیح خواهیم داد.برای Database Initializer در EF سه استراتژی وجود دارد

Database Initializer در روش Entity Framework Code-First

روش Code First روشی است که در آن تمام کلاس های مدلی که برای طراحی دیتابیس احتیاج دارید خودتان ایجاد و تعریف می کنید.بنابراین کنترل کاملی بر روی کلاس هایی که نوشته اید دارید.در این روش فقط کاری که برنامه نویس باید بر روی آن تمرکز کند نوشتن کد های مربوط به کلاس ها است .و دیگر بر روی طراحی دیتابیس تمرکز نمی کند.منطق روش Code First چیزی به نام database Initializers است .

در این مقاله قصد داریم منطق database Initializers را شرح دهیم .همچنین نحوه کار این منطق برای ایجاد و به روزرسانی رکورد ها را شرح دهیم .

برای افزودن Initializer به dbcontext به کدی مانند زیر احتیاج داریم .

برای این کد نیاز به Name Spade به نام using System.Data.Entity داریم .در ادامه به شرح database initializer خواهیم پرداخت .

ساخت دیتابیس در حالتی که وجود ندارد .

این حالت حالت پیش فرض کلاس initializer با استفاده از Code first است .زمانی که برنامه شروع به کار می کند initializer شروع به چک کردن مدل های دیتابیس مورد نیاز می کند .اگر مدلی وجود نداشته باشد دیتابیس را ایجاد می کند.فرض کنید که یک پروژه ایجاد کرده ایم .و مدلی با تعدادی Property مختلف ایجاد کرده ایم .حال یک کنترلر ایجاد میکنیم .و تمام چهار عمل اصلی برای افزودن به دیتابیس ، حذف از آن و یا به روزرسانی و نمایش اطلاعات را انجام داده ایم و هر کدام از این ها هم view مربوط به خود را دارند.

یک پروژه جدید ایجاد کنید

نوع این پروژه را از نوع Asp.NET MVC 4  در نظر بگیرید.

در پنجره بعدی گزینه Internet Application را انتخاب کنید.

یک مدلی مانند کد زیر به پروژه خود اضافه کنید .

حال کنترلی جدید به صورت زیر اضافه کنید

حال برنامه خود را اجرا کنید .

به ازای هر Property در مدل ما دو فیلد در View می بینیم .

حال اگر رکوردی به دیتابیس خود اضافه کنیم شکل زیر در View مربوط به Detail دیده خواهد شد.

حال اگر پنجره Server Explorer را باز کنیم خواهید دید که دیتابیس Employee به طور خودکار و فقط توسط همین کد هایی که نوشته بودیم ساخته شده است.و در داخل آن هم اطلاعات زده شده در View قبل وجود دارد.

بدین ترتیب مشاهده کردید که Initializer دیتابیسی را که وجود نداشت با همه تنظیماتی که سمت کد انجام شده بود برای ما ساخت .

2-حذف کردن دیتابیس ایجاد شده در صورت ایجاد تغییر در مدل

همان طور که از عنوان می توان فهمید در این حالت Database Initializer جداولی که در مدل مربوط به آن تغییری ایجاد کرده باشید حذف خواهد کرد.و مورد خطرناک این است که کلیه داده های موجود در این جداول هم حذف خواهند شد .

در شکل زیر ابتدا یک مدل ایجاد کرده بودیم و سپس آن را در حالت New Model  تغییر داده ایم .

حال برای همان پروژه قبلی که ایجاد کرده بودیم در قسمت dbContext تغییراتی ایجاد می کنیم و Database Initializer که ایجاد می کنیم از نوع DropCreateDatabaseWhenModelChanges ایجاد می کنیم .

بعد از این کنترلر را بازنویسی می کنیم تا View ها بر اساس مدل جدید ما به روزرسانی شوند .

بعد از اضافه کردن دیتا شکل زیر را در View مربوط به Detail خواهیم دید.

اگر سری به دیتابیس بزنیم می بینیم که جدول قبلی پاک شده است .یعنی در این روش همان طور که از نام آن مشخص است در صورت تغییر مدل جدول مربوط به آن پاک شده و دوباره ساخته خواهد شد.

DropCreateDatabaseAlwaysهمیشه دیتابیس قبلی راپاک کن و دوباره ایجاد کن

این استراتژی از روش Code First در هر زمانی که برنامه خود را اجرا کنید دیتابیس قبلی را پاک کرده و دوباره آنرا می سازد!!!!

در کد زیر می بینید که برای اتخاذ این روش باید نوع database Initializer خود را به DropCreateDatabaseAlways تغییر دهیم .

دوباره پروژه را Build و اجرا کنید .و رکوردهای جدیدی را اضافه کنید .

بعد از این اگر به دیتابیس مراجعه کنید می بینید که تمام رکورد های قبلی پاک شده اند .در واقع در این حالت دیتابیس دوباره ایجاد می شود.

نتیجه گیری:تمام سه استراتژی بالا برای Database Initializer در روش Code First زمانی که شما مدل خود را عوض کنید با شکست مواجه می شوند .برای غلبه بر این ضعف Code First روش Migration به وجود آمد .توسط Migration می توانید دیتابیس خود را بر اساس مدل جدید و به روزرسانی شده خود تغییر دهید و البته دیتایی را هم از دست ندهید.

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان

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

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید