آموزش migration و Entity Framework در Code First
بسم الله الرحمن الرحیم
در دوره های گذشته آموزش های 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>());
بسم الله الرحمن الرحیم
در دوره های گذشته آموزش های 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, Migrations.Configuration>());
IDatabaseInitializer
بسیاری از دوستان سوال پرسیدند که چطور می توانند یک روش جدید برای اعمال تغییرات ایجاد کنند. اگر شما هیچ یک گزینه های بالا را مناسب کار خود نمی دانید، می توانید با پیاده سازی IDatabaseInitializer interface یک روش اختصاصی برای خود ایجاد کنید.
آموزش طراحی یک پروژه MVC با استفاده از Code First Migrations in Entity Framework
برای درک بهتر یک مثال را با هم دیگر پیاده سازی می کنیم. ابتدا یک پروژه ASP.NET MVC ایجاد کنید و در Folderمر بوط به Model کلاس های زیر را ایجاد کنید ( کدهای این برنامه برای دانلود نیز قرار داده شده است، اگر با MVC آشنایی ندارید از این کدها استفاده کنید).
Model Class
public class 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 ها بنویسیم.
اگر با Fluent API ها آشنایی ندارید، می توانید از دوره آموزشی که در این زمینه قبلا نوشته ایم استفاده کنید.
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 => p.Name).HasColumnType("VARCHAR").IsRequired().HasMaxLength(50);
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
بروز رسانی پایگاه داده
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; }
}
بروز رسانی پایگاه داده
حال باید برای بروز رسانی پایگاه داده خود دستورات زیر را اجرا کنیم.
ساخت migration
Add-Migration MigrationsName
بروز رسانی پایگاه داده با migration
Update-Database
پس از اجرای دستورات بالا، مجددا یک فایل جدید در پوشه migration با نام دستور migration ایی که اجرا کرده ایم، ایجاد می شود. این فایل شما entity هایی است که در پایگاه داده ما ایجاد شده اند و یا برروز شده اند.
در نهایت پایگاه داده ما نیز بروز رسانی می شود.
Undo/Rollback a Migrations
بسیاری از دوستان سوال پرسیده بودند که وقتی با Code First تغییری در پایگاه داده ایجاد می کنیم چطور می توانیم، به یک مرحله قبل و یا چند مرحله قبل تر بازگردیم. این موضوع را در بخشی جداگانه بررسی کردیم، اما مختصرا اینجا نیز آن را بیان می کنیم.
Rollback به یک migrations خاص
Update-Database -TargetMigration:MigrationsName
Rollback به اولین migrations
Update-Database -TargetMigration:0
Mostafa
سلام
مطالب شما کمکم کرد.
متشکرم
شیما
واقعا عالیه من که کلی بهره بردم و سایتتون را به دوستانم معرفی کردم
انشالله موفق باشید
رهگذر
سایتتون فوق العادس.
md
سلام و تشکر
وبلاگ خیلی خوبی دارید.
md
با سلام و تشکر از شما
اگر یک پایگاه داده حاوی اطلاعات از قبل وجود داشته باشد و ما بخواهیم به روش code first
جداولی به ان اضافه کنیم به شرطی که هیچ یک از داده های قبلی پاک نشوند, باید از چه روشی استفاده کرد.
ممنون
اسماعیلشیدایی
بسم الله الرحمن الرحیم
با عرض سلام
در همین مطلب بخشی را در خصوص نحوه انجام این کار اضافه شد.
کافی است از دستور MigrateDatabaseToLatestVersion استفاده نمایید
موفق باشید.
رضاناظم
ممنون از شما بابت انتشار این مطالب
من سوالی داشتم ممنون میشوم اگر کمکم کنید
من برنامه ای با استفاده از Ef6 نوشته ام که برای مشتریان نصب شد . ساخت دیتا بیس توسط migration در ابتدای کار انجام شده حال در صورت تغییر در ساختار دیتابیس مثلا اضافه شدن یک فیلد ، چگونه می توان با migration دیتابیس مشتریان که دارای داده معتبر است ، را به روز رسانی کرد و فیلد مورد نظر را اضافه نمود .
اسماعیلشیدایی
با عرض سلام خدمت شما
با استفاده از Package Manager Console به روش های مختلفی می توانید دیتابیس های مربوطه را به روز رسانی کنید اما یکی از بهترین روش ها ایجاد Script است. برای این کار کافی است دستور زیر را در Package Manager Console اجرا کنید تا یک SQL Script برای شما ساخته شود و بعدا شما نیز به راحتی می توانید آن را بر روی دیتابیس های مختلف خود اجرا کنید.
موقق باشید
Atefe
سلام خسته نباشید موقع ساخت Migration با دستورات enable migration همچین خطایی میده و اجازه ساخت پوشه را نمیده .
میشه لطفا علت رو بگید .
ممنون میشم
PM> enable-migrations More than one context type was found in the assembly 'MVCproject'. To enable migrations for MVCproject.Models.UsersContext, use Enable-Migrations -ContextTypeName MVCproject.Models.UsersContext. To enable migrations for MVCproject.Models.DataContext, use Enable-Migrations -ContextTypeName MVCproject.Models.DataContext.
اسماعیلشیدایی
با عرض سلام
شما در پروژه ی خود بیش از یک Context را ایجاد و یا معرفی کرده اید از همین رو وقتی دستور enable را فراخوانی می کنید migrations نمی داند کدام Context را باید فعال کند برای همین شما باید Context مورد نظر خود را مشخص کنید.
Atefe
شما میگید که سریع پاسخگویی می کنید اما نظرو تایید می کنید اما جواب نمی دید ؟؟؟؟ ممنون از پاسخگوییتون !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
اسماعیلشیدایی
با سلام
بابت تاخیر عذرخواهی می کنیم، حجم سوالات و مطالب درخواستی زیاد است از این باب باید ما را ببخشید.
سعی خواهیم کرد از این پس سریعتر پاسخ بدهیم
ممنون بابت نظر و لطف شما