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

آموزش 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>());

 

 

 

 

 

 

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

 

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


 

نظرات

  • Hannah Martinez
    Mostafa
    دو شنبه 11 دی 1278 - 0:00

    سلام
    مطالب شما کمکم کرد.
    متشکرم

  • Hannah Martinez
    شیما
    دو شنبه 11 دی 1278 - 0:00

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

  • Hannah Martinez
    رهگذر
    دو شنبه 11 دی 1278 - 0:00

    سایتتون فوق العادس.

    واقعا عالیه.
    موفق باشید

  • Hannah Martinez
    md
    دو شنبه 11 دی 1278 - 0:00

    سلام و تشکر
    وبلاگ خیلی خوبی دارید.

  • Hannah Martinez
    md
    دو شنبه 11 دی 1278 - 0:00

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

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

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

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

      موفق باشید.

  • Hannah Martinez
    رضاناظم
    دو شنبه 11 دی 1278 - 0:00

    ممنون از شما بابت انتشار این مطالب

    من سوالی داشتم ممنون میشوم اگر کمکم کنید

    من برنامه ای با استفاده از Ef6 نوشته ام که برای مشتریان نصب شد . ساخت دیتا بیس توسط migration در ابتدای کار انجام شده حال در صورت تغییر در ساختار دیتابیس مثلا اضافه شدن یک فیلد ، چگونه می توان با migration دیتابیس مشتریان که دارای داده معتبر است ، را به روز رسانی کرد و فیلد مورد نظر را اضافه نمود .

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام خدمت شما 

      با استفاده از Package Manager Console به روش های مختلفی می توانید دیتابیس های مربوطه را به روز رسانی کنید اما یکی از بهترین روش ها ایجاد Script است. برای این کار کافی است دستور زیر را در Package Manager Console اجرا کنید تا یک SQL Script برای شما ساخته شود و بعدا شما نیز به راحتی می توانید آن را بر روی دیتابیس های مختلف خود اجرا کنید.

       

      
      	Update-Database -Script
      
      

       

      موقق باشید

       

  • Hannah Martinez
    Atefe
    دو شنبه 11 دی 1278 - 0:00

    سلام خسته نباشید موقع ساخت 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.

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با عرض سلام

      شما در پروژه ی خود بیش از یک Context را ایجاد و یا معرفی کرده اید از همین رو وقتی دستور enable را فراخوانی می کنید migrations نمی داند کدام Context را باید فعال کند برای همین شما باید Context مورد نظر خود را مشخص کنید.

       

      Enable-Migrations -ContextTypeName MVCproject.Models.UsersContext
       

       

  • Hannah Martinez
    Atefe
    دو شنبه 11 دی 1278 - 0:00

    شما میگید که سریع پاسخگویی می کنید اما نظرو تایید می کنید اما جواب نمی دید ؟؟؟؟ ممنون از پاسخگوییتون !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    • Judith Bell
      پاسخ
      اسماعیلشیدایی
      دو شنبه 11 دی 1278 - 0:00

      با سلام

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

      ممنون بابت نظر و لطف شما 

       

نظرات یا سوالات خودرا با ما درمیان بگذارید

0912 097 5516 :شماره تماس
0713 625 1757 :شماره تماس