EF Code First Migrations資料庫遷移

libingql發表於2013-09-20

1、EF Code First建立資料庫

  新建控制檯應用程式Portal,通過程式包管理器控制檯新增EntityFramework。

  在程式包管理器控制檯中執行以下語句,安裝EntityFramework。

PM> Install-Package EntityFramework

  安裝成功後,介面提示如下圖:

   在新建的Portal控制檯應用程式中新增兩個實體類,程式碼結構如下:

  其中,類檔案PortalContext.cs的程式碼如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data.Entity;
using System.Data.Entity.Infrastructure;

using Portal.Entities;
using Portal.Mapping;

namespace Portal
{
    public class PortalContext : DbContext
    {
        static PortalContext()
        {
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<PortalContext>());
        }

        public DbSet<Province> Provinces { get; set; }
        public DbSet<Category> Categories { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Configurations.Add(new ProvinceMap());
            modelBuilder.Configurations.Add(new CategoryMap());
        }
    }
}

  在靜態建構函式中,設定了當資料庫模型發生改變時,則刪除當前資料庫,重建新的資料庫。

  程式碼執行後,生成的資料庫:

 

2、EF Code First資料庫遷移

2.1、生成資料庫

  修改類檔案PortalContext.cs的靜態建構函式,取消當資料庫模型發生改變時刪除當前資料庫重建新資料庫的設定。

static PortalContext()
{
    Database.SetInitializer<PortalContext>(null);
}

   1>、在程式包管理器控制檯,執行語句:

PM> Enable-Migrations -EnableAutomaticMigrations

 

  執行成功後,Portal控制檯應用程式程式碼結構中,新增Migrations資料夾,並生成類檔案Configuration.cs。

namespace Portal.Migrations
{
    using System;
    using System.Data.Entity;
    using System.Data.Entity.Migrations;
    using System.Linq;

    internal sealed class Configuration : DbMigrationsConfiguration<Portal.PortalContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;
        }

        protected override void Seed(Portal.PortalContext context)
        {
            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
}

   2>、在程式包管理器控制檯,執行語句:

PM> Add-Migration InitialCreate

  執行成功後,在Migrations資料夾中新增類檔案201309201556388_InitialCreate.cs

  3>、在程式包管理器控制檯,執行語句:

PM> Update-Database -Verbose

  執行結果生成與上面一致的資料庫

  4>、在資料庫模型中新增City類,執行程式包管理器控制檯語句,Migrations資料夾中新增類檔案201309201643300_AddCity.cs。

PM> Add-Migration AddCity

  再次執行程式包管理器控制檯語句

PM> Update-Database -Verbose

  Portal控制檯應用程式的程式碼結構:

  資料庫更新成功之後,在資料庫中新增表City。

2.2、版本回溯

  修改資料庫中表City,刪除其中欄位ProvinceNo。在程式包管理器控制檯中執行以下兩條語句:

PM> Add-Migration ModifyCity
PM> Update-Database -Verbose

  執行成功之後,City表結構修改為:

  執行程式包管理器控制檯語句,進行資料庫版本回溯。

PM> Update-Database –TargetMigration:"201309201643300_AddCity.cs"

2.3、生成資料庫版本之間的Sql指令碼

  執行程式包管理器控制檯語句,生成資料庫版本之間的Sql指令碼。該操作僅為生成Sql語句,並未在資料庫中進行執行。

Update-Database -Script -SourceMigration:"201309201643300_AddCity.cs" -TargetMigration:"201309201708043_ModifyCity.cs" 

  其中-TargetMigration在未指定的情況,預設為遷移到最新的版本。

3、EF Code First Migrations語句的其他引數

1>、為指定的DbContext啟用資料庫遷移

PM> Enable-Migrations -ContextTypeName Portal.PortalContext

2>、設定是否允許自動遷移

Enable-Migrations

生成的Configuration.cs類檔案的建構函式

public Configuration()
{
      AutomaticMigrationsEnabled = false;
}

3>、Enable-Migrations指定專案名稱

PM> Enable-Migrations -StartUpProjectName Portal

如果在“Package Manager Console”中選擇了預設專案可以不設定“-StartUpProjectName”引數;如果多次執行此命令可以新增-Force引數。

4>、檢視所執行的Sql語句 -Verbose指令

Update-Database -Verbose 

4、程式碼下載

Portal.zip

5、參考資料

http://msdn.microsoft.com/en-US/data/jj591621

相關文章