EF Code First 更新數據庫, 數據庫遷移


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

 

原文地址:http://www.cnblogs.com/libingql/p/3330880.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM