一、EF Code First建立數據庫數據庫
新建控制檯應用程序Portal,經過程序包管理器控制檯添加EntityFramework。app
在程序包管理器控制檯中執行如下語句,安裝EntityFramework。ide
PM> Install-Package EntityFramework函數
安裝成功後,界面提示以下圖:ui
在新建的Portal控制檯應用程序中添加兩個實體類,代碼結構以下:spa
其中,類文件PortalContext.cs的代碼以下:3d
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()); } } }
在靜態構造函數中,設置了當數據庫模型發生改變時,則刪除當前數據庫,重建新的數據庫。code
代碼執行後,生成的數據庫:blog
二、EF Code First數據庫遷移ip
2.一、生成數據庫
修改類文件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.二、版本回溯
修改數據庫中表City,刪除其中字段ProvinceNo。在程序包管理器控制檯中執行如下兩條語句:
PM> Add-Migration ModifyCity
PM> Update-Database -Verbose
執行成功以後,City表結構修改成:
執行程序包管理器控制檯語句,進行數據庫版本回溯。
PM> Update-Database –TargetMigration:"201309201643300_AddCity.cs"
2.三、生成數據庫版本之間的Sql腳本
執行程序包管理器控制檯語句,生成數據庫版本之間的Sql腳本。該操做僅爲生成Sql語句,並未在數據庫中進行執行。
Update-Database -Script -SourceMigration:"201309201643300_AddCity.cs" -TargetMigration:"201309201708043_ModifyCity.cs"
其中-TargetMigration在未指定的狀況,默認爲遷移到最新的版本。
三、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
五、參考資料