آموزش migration در Entity به روش Code First

آموزش migration در Entity به روش Code First

آموزش migration و Entity Framework در Code First

روش Code First به شما اجازه می دهد تا از روی کلاس های خود Table های پایگاه داده را ایجاد کنید. مثلا شما یک کلاس برای ثبت نام افراد ایجاد می کنید و Property ها این کلاس را (نام، نام خانوادگی و...) تعریف می کنید، سپس به وسیله Migration شما می توانید از روی این کلاس Table مورد نظر خود را ایجاد کنید.

Migration کلاس شما را که Model خوانده می شود به وسیله ابزاری که درVisual Studio 2013 و Visual Studio 2012با نام Package Manager Console قرار داده شده است تبدیل به Table های پایگاه داده می کند. وقتی شما می خواهید پایگاه داده خود را به وسیله Migration ایجاد کنید، چند انتخاب پیش روی شما قرار خواهد گرفت.

CreateDatabaseIfNotExists

با انتخاب این گزینه تنها اگر پایگاه داده شما وجود نداشته باشد، پایگاه داده شما به وجود خواهد آمد، اینکار باعث می شود که اگر قبلا پایگاه داده خود را ایجاد کرده اید، پایگاه داده شما از تغییرات محافظت شود.

DropCreateDatabaseWhenModelChanges

انتخاب این گزینه باعث می شود که اگر شما تغییری بر روی Model (کلاس سی شارپ) خود ایجاد کنید پایگاه داده شما هم بر روز شود مثلا اگر Property ایی با نام Name را به FirstName تغییر دهید، این تغییر بر روی دیتابیس نیز اعمال می شود. این گزینه برای زمان توسعه و تست سیستم ها بسیار مناسب است زیرا تغییرات به صورت خودکار بر روی پایگاه داده اعمال می شود.

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

Database.SetInitializer(new DropCreateDatabaseIfModelChanges<Context>());

DropCreateDatabaseAlways

این گزینه بسیار خطرناک است، زیرا باعث می شود با هر بار اجرای برنامه پایگاه داده شما حذف و مجددا ایجاد شود. البته این گزینه برای زمان توسعه که می خواهید اطلاعات تست در سیستم شما قبل از هر بار اجرا حذف شود مناسب است اما طبیعتا نباید هیچ وقت از این گزینه برای وب سایت آپلود شده استفاده کنید.

MigrateDatabaseToLatestVersion

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

Database.SetInitializer(new MigrateDatabaseToLatestVersion<Context,Model.Configuration>());

IdatabaseInitializer

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

آموزش طراحی یک پروژه MVC با استفاده از Code First Migrations in Entity Framework

برای درک بهتر یک مثال را با هم دیگر پیاده سازی می کنیم. ابتدا یک پروژه ASP.NET MVC ایجاد کنید و در Folder مربوط به Model کلاس های زیر را ایجاد کنید

Model Class public class Category Category { public int CategoryID { get; set; } public string Name { get; set;} } public class Product { public int ProductID { get; set; } public string Name { get; set; } public decimal Price { get; set; } public int CatID { get; set; } public virtual Category Category { get; set; } }

Mapping

در کلاس DataContext می بایست Fluent APIهای مورد نظر خود را برای ایجاد Relation بین Table ها بنویسیم.

public class DataContext : DbContext { public DataContext():base("DefaultConnection"){ } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Category>().HasKey(c => c.CategoryID); modelBuilder.Entity<Category>().Property(p => modelBuilder.Entity<Product>().HasKey(p => p.ProductID); modelBuilder.Entity<Product>().Property(p => p.Name).HasColumnType("VARCHAR").IsRequired().HasMaxLength(50); modelBuilder.Entity<Product>().Property(p => p.Price).HasColumnType("DECIMAL").IsRequired(); modelBuilder.Entity<Product>().HasRequired(m => m.Category).WithMany().HasForeignKey(c => c.CatID); } public DbSet<Product> Product { get; set; } public DbSet<Category> Category { get; set;} }

Connection String

می بایست Connection String مربوط به پروژه خود را به صورت زیر تنظیم کنیم.

<connectionStrings> <add name="DefaultConnection" providerName="System.Data.SqlClient" connectionString="data source=SHAILENDRA\SQLEXPRESS;initial catalog=EFCodeFirst;persist security info=True;user id=sa;password=mypassword; App=EntityFramework" /> </connectionStrings>

Visual Studio Package Manager Console

برای ساخت این دو Entity می بایست از ابزار Package Manager Console به صورت زیر استفاده کنیم.

ساخت پایگاه داده

پس از باز کردن پنجره Package Manager Console، می بایست برای ساخت پایگاه داده دستورات زیر را به ترتیب اجرا کنیم.

فعال کردن migrations

Enable-Migrations

ساخت migration

Add-Migration MigrationsName

بروز رسانی migration

Update-DataBase

هنگامی که دستورات بالا را به ترتیب اجرا کردید:

ابتدا یک پوشه با نام Migrations ایجاد می شود، که در آن فایلی با نام Configuration.cs اضافه می شود، این فایل حاوی تنظیمات برنامه می باشد. در فاز دوم یک کلاس با یک نام منحصر به فرد که شامل یک عدد به علاوه underscore و سپس نام دستور Migration ای که اجرا کرده ایم، ایجاد می شود.این فایل شامل Entity هایی است که در پایگاه داده ایجاد شده است.

بعد از این مرحله در SQL Server شما یک پایگاه داده معادل نامی که در Connection String قرار داده اید ایجاد می شود. شما نام پایگاه داده خود را در Connection String به صورت (initial catalog = YourDBName) مشخص می کنید.

تا اینجا شما یک پایگاه داده از روی Model خود به صورت Code First ایجاد کردید.

حال می خواهیم یک کلاس جدید (Model) به پروژه خود با نام Customer به صورت زیر اضافه کنیم.

اضافه کردن یک Modelجدید

public class Customer { public int CustomerID { get; set; } public string Name { get; set; } public string Address { get; set;

بروز رسانی پایگاه داده

Add-Migration MigrationsName

بروز رسانی پایگاه داده با migration

Update-Database

پس از اجرای دستورات بالا، مجددا یک فایل جدید در پوشه migration با نام دستور migration ایی که اجرا کرده ایم، ایجاد می شود. این فایل شما entity هایی است که در پایگاه داده ما ایجاد شده اند و یا برروز شده اند.

در نهایت پایگاه داده ما نیز بروز رسانی می شود.

Undo/Rollback a migration

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

Rollback به یک migrations خاص

Update-Database – TargetMigration: :MigrationsNam

Rollback به اولین migration

Update-Database – TargetMigration:0



نظرات کاربران



عبارت امنیتی : حاصل 3 × 8 می شود :
متن پیام :