ably ably برای هدایت شدن به سایت جدید اینجا کلیک کنید

آموزش برنامه نویسی

آموزش برنامه نویسی وب، اندروید، ویندوز , اسکیوال و...
Tell: 0912 097 5516
| Email: Hello@EduOnline.ir

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

بسم الله الرحمن الرحیم

در دوره های گذشته آموزش های 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>());

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 به صورت زیر استفاده کنیم.


آموزش migration

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

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

فعال کردن migrations

Enable-Migrations

ساخت migration

Add-Migration MigrationsName

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

Update-Database

آموزش migration


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

ابتدا یک پوشه با نام Migrations ایجاد می شود، که در آن فایلی با نام Configuration.cs اضافه می شود، این فایل حاوی تنظیمات برنامه می باشد.

آموزش migration



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

آموزش migration



تا اینجا شما یک پایگاه داده از روی 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 هایی است که در پایگاه داده ما ایجاد شده اند و یا برروز شده اند.

آموزش migration

آموزش migration

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

آموزش migration

Undo/Rollback a Migrations

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


Rollback به یک migrations خاص 

Update-Database -TargetMigration:MigrationsName

Rollback به اولین migrations

Update-Database -TargetMigration:0



نظرات (۴)

با سلام و تشکر از شما
اگر یک پایگاه داده حاوی اطلاعات از قبل وجود داشته باشد و ما بخواهیم به روش code first
جداولی به ان اضافه کنیم به شرطی که هیچ یک از داده های قبلی پاک نشوند, باید از چه روشی استفاده کرد.
ممنون
پاسخ:
بسم الله الرحمن الرحیم
با عرض سلام

در همین مطلب بخشی را در خصوص نحوه انجام این کار اضافه شد.
 کافی است از دستور MigrateDatabaseToLatestVersion استفاده نمایید

موفق باشید.
سایتتون فوق العادس.
واقعا عالیه.
موفق باشید
واقعا عالیه من که کلی بهره بردم و سایتتون را به دوستانم معرفی کردم
انشالله موفق باشید
سلام
مطالب شما کمکم کرد.
متشکرم
ارسال نظر آزاد است، اما اگر قبلا در بیان ثبت نام کرده اید می توانید ابتدا وارد شوید.
شما میتوانید از این تگهای html استفاده کنید:
<b> یا <strong>، <em> یا <i>، <u>، <strike> یا <s>، <sup>، <sub>، <blockquote>، <code>، <pre>، <hr>، <br>، <p>، <a href="" title="">، <span style="">، <div align="">
تجدید کد امنیتی
up
ما را در گوگل محبوب کنید