很久沒有在博客園更新博客了,現在都換了新公司。前段時間寫了關於EF遷移的文檔,今天拿出來做爲這個系列的一篇吧。html
Enable-Migrations 啓用遷移數據庫
Add-Migration 爲掛起的Model變化添加遷移腳本框架
Update-Database 將掛起的遷移更新到數據庫ide
Get-Migrations 獲取已經應用的遷移工具
現有一個Demo,有以下Product模型:spa
1: public class Product
2: {
3:
4: public int ProductId { get; set; }
5:
6: public string ProductName { get; set; }
7:
8: public decimal Price { get; set; }
9:
10: }
修改Product,添加以下兩個屬性:命令行
1: public DateTime CreateDate { get; set; }
2:
3: public string Unit { get; set; }
其中,CreateDate和Unit都是必須的。3d
在Package Manager Console中執行Enable-Migrations啓動遷移。code
執行get-help Enable-Migrations –detailed 查看Enable-Migrations的詳細用法。orm
-ContextTypeName 指定要使用的Context
-EnableAutomaticMigrations 啓動自動遷移
-ProjectName 指定搭建的遷移類添加到的項目
-StartUpProjectName 指定使用的配置文件所在的項目
-ConnectionStringName 指定使用配置文件中鏈接字符串的名稱
-ConnectionString 指定使用的鏈接字符串
-ConnectionProviderName 指定鏈接字符串的provider名稱
-Force 重寫遷移配置
本Demo中執行
Enable-Migrations -ProjectName Demo.Domain -StartUpProjectName MigrationsDemo
執行結果是:檢測到數據庫是由database initializer建立,爲現有的數據庫搭建初始化遷移腳本。本Demo中是在Demo.Domain項目中建立了一個Migrations文件夾,以及Migrations中的2個文件:Configuration.cs和201311010641361_InitialCreate.cs
Configuration 類。此類容許您針對上下文配置遷移的行爲。
InitialCreate 遷移。此遷移已在啓用遷移以前生成,由於咱們事先讓 Code First 自動建立了一個數據庫。此基架遷移中的代碼表示數據庫中已建立的對象。
若是還沒有建立數據庫,則不會將此 InitialCreate 遷移添加到項目中。而是,首次調用 Add-Migration 時,用於建立這些表的代碼將爲新遷移搭建基架。
在Package Manager Console中執行Add-Migration搭建掛起的Model變化遷移腳本。
執行get-help Add-Migration –detailed查看Add-Migration的詳細用法。
-Name 指定自定義腳本的名稱
-Force
-ProjectName
-StartUpProjectName
-ConfigurationTypeName 指定使用的遷移配置
-IgnoreChanges 忽略檢測到掛起的model改變,建立一個空的遷移。這個選項可用來爲已有的數據庫啓用遷移建立一個初始的,空的遷移。
-ConnectionStringName 指定使用配置文件中鏈接字符串的名稱
-ConnectionString 指定使用的鏈接字符串
-ConnectionProviderName 指定鏈接字符串的provider名稱
本Demo中執行
Add-Migration Add_Product_CreateDateAndUnit -ProjectName Demo.Domain
生成的Add_Product_CreateDateAndUnit:
前面提到CreateDate和Unit都是必須的,像Unit是string類型的,更新到數據庫默認值爲空,CreateDate默認值爲1900/1/1 0:00:00,以下圖
若是須要更改CreateDate或Unit的值,能夠在Up()中使用Sql方法:
注:更新腳本時,將Unit設爲中文,記得加’N’,不然在LocalDB中更新的內容會變成’?’,在SQL Server 2008 R2中沒有,不管用什麼數據庫加上都是一個好習慣!
若是要映射現有的數據庫,能夠執行Add-Migration Initial,而後執行 Update-Database
這樣就建立了一個初始的遷移。在這個基礎上再修改Demo,而後遷移。
在Package Manager Console中執行Update-Database將掛起的遷移更新到數據庫。
執行get-help Update-Database -detailed查看Add-Migration的詳細用法。
-SourceMigration 只有-Script打開時纔有效。指定遷移的名稱用做更新的起點。忽略則使用最後一次應用的遷移。
-TargetMigration 指定將數據庫更新到哪一個遷移的名稱。
-Script 生成SQL腳本
-Force
-ProjectName
-StartProjectName
- ConfigurationTypeName
-ConnectionStringName 指定使用配置文件中鏈接字符串的名稱
-ConnectionString 指定使用的鏈接字符串
-ConnectionProviderName 指定鏈接字符串的provider名稱
本Demo中執行
Update-Database -ProjectName Demo.Domain
上面提到可使用-TargetMigration開關將數據庫遷移到特定的狀態。好比,撤銷數據庫新添加的CreateDate和Unit字段。執行
Update-Database -ProjectName Demo.Domain -TargetMigration:InitialCreate
若是要一直回滾到空數據庫,可使用 Update-Database –TargetMigration:0或-TargetMigration:$InitialDatabase命令。
生成SQL腳本要使用-Script開關,另外兩個比較重要的開關是:-SourceMigration和-TargetMigration。
好比咱們要生成InitialCreate到 Add_Product_CreateDateAndUnit的遷移SQL腳本,則執行以下命令:
Update-Database -ProjectName Demo.Domain -Script -SourceMigration:InitialCreate -TargetMigration:Add_Product_CreateDateAndUnit
生成下面的SQL腳本
若是忽略-SourceMigration開關,則使用最後一次應用的遷移做爲起點,忽略-TargetMigration,則使用最新遷移做爲終點。
經過註冊 MigrateDatabaseToLatestVersion 數據庫初始值設定項來實現該功能。數據庫初始值設定項只是包含用於確保數據庫安裝正確的某種邏輯。首次在應用程序進程 (AppDomain) 中使用上下文時,將運行此邏輯。
Demo中執行
Database.SetInitializer(new MigrateDatabaseToLatestVersion<OrderContext, Configuration>());
其中Configuration生成的是internal sealed class,不在一個程序集中須要修改爲public
將命令行工具migrate.exe複製到包含遷移配置的程序集位置,能夠在VS外部進行遷移操做。
在使用 NuGet 安裝實體框架時,migrate.exe 位於下載包的 tools 文件夾中。在 <項目文件夾>\packages\EntityFramework.<版本>\tools 中
有了 migrate.exe 以後,須要將其複製到包含遷移的程序集位置。
若是應用程序面向 .NET 4 而不是 4.5,則還須要將 Redirect.config 複製到這個位置,並將其重命名爲 migrate.exe.config。這樣,migrate.exe 會讓正確的綁定重定向可以找到實體框架程序集。
注意:migrate.exe 目前不支持 x64 程序集。
migrate.exe /? 顯示幫助信息
migrate assembly [configurationType] [/targetMigration]
[/startUpDirectory] [/startUpConfigurationFile]
[/startUpDataDirectory] [/connectionStringName]
[/connectionString] [/connectionProviderName] [/force] [/verbose]
[/?]
Assembly 指定包含遷移配置類型的程序集
[configurationType] 指定遷移配置類型的名稱
[connectionProviderName] 指定鏈接字符的provider
[connectionString] 指定使用的鏈接字符串
[connectionStringName] 指定配置文件中使用的鏈接字符串名稱
[force] 表示容許自動遷移引發數據丟失
[startUpConfigurationFile] 指定程序的Web.config或App.config
[startUpDataDirectory] 指定當解析包含|DataDirectory|的鏈接字符串時使用的目錄
[targetMigration] 指定遷移到的版本
[verbose] 指定輸出執行的SQL和其餘信息到控制檯
本Demo中執行
migrate Demo.Domain.dll /startUpConfigurationFile="MigrationsDemo.exe.config" /targetMigration=」 Add_Product_CreateDateAndUnit」 /verbose