Code First 遷移可用於從 Visual Studio 內部更新資料庫,但也可通過命令行工具 migrate.exe 來執行。本頁簡單介紹如何使用 migrate.exe 對資料庫執行遷移。 複製 migrate.exe 在使用 NuGet 安裝實體框架時,migrate.exe 位於下載包 ...
Code First 遷移可用於從 Visual Studio 內部更新資料庫,但也可通過命令行工具 migrate.exe 來執行。本頁簡單介紹如何使用 migrate.exe 對資料庫執行遷移。
複製 migrate.exe
在使用 NuGet 安裝實體框架時,migrate.exe 位於下載包的 tools 文件夾中。在 <項目文件夾>\packages\EntityFramework.<版本>\tools 中
有了 migrate.exe 之後,需要將其複製到包含遷移的程式集位置。
如果應用程式面向 .NET 4 而不是 4.5,則還需要將 Redirect.config 複製到這個位置,並將其重命名為 migrate.exe.config。這樣,migrate.exe 會讓正確的綁定重定向能夠找到實體框架程式集。
.NET 4.5 | .NET 4.0 |
註意:migrate.exe 目前不支持 x64 程式集。
使用 Migrate.exe
將 migrate.exe 移至正確的文件夾之後,應能夠用它對資料庫執行遷移。這個實用工具的唯一目的是執行遷移。它不能生成遷移或創建 SQL 腳本。
查看選項
Migrate.exe /? |
上面顯示了與此實用工具關聯的幫助頁。請註意,要讓此選項起作用,在運行 migrate.exe 的同一位置需要有 EntityFramework.dll。
遷移至最新遷移
Migrate.exe MyMvcApplication.dll /startupConfigurationFile=”..\web.config” |
在運行 migrate.exe 時,唯一的強制參數是程式集,該程式集包含嘗試運行的遷移,但如果不指定配置文件,它將使用所有基於約定的設置。
遷移至特定遷移
Migrate.exe MyApp.exe /startupConfigurationFile=”MyApp.exe.config” /targetMigration=”AddTitle” |
如果需要將遷移運行至特定遷移,可以指定遷移的名稱。這將根據需要運行所有以前的遷移,直至到達指定的遷移。
指定工作目錄
Migrate.exe MyApp.exe /startupConfigurationFile=”MyApp.exe.config” /startupDirectory=”c:\MyApp” |
如果程式集有依賴項或相對於工作目錄讀取文件,則需要設置 startupDirectory。
指定要使用的遷移配置
Migrate.exe MyAssembly CustomConfig /startupConfigurationFile=”..\web.config” |
如果有多個遷移配置類(從 DbMigrationConfiguration 繼承的類),則需要指定要用於此執行的類。可通過指定不帶開關的可選第二個參數來進行這種指定,如上所示。
提供連接字元串
Migrate.exe BlogDemo.dll /connectionString=”Data Source=localhost;Initial Catalog=BlogDemo;Integrated Security=SSPI” /connectionProviderName=”System.Data.SqlClient” |
如果希望在命令行指定連接字元串,還必須指定提供程式名稱。不指定提供程式名稱會導致異常。
常見問題
錯誤消息 | 解決方案 |
未經處理的異常: System.IO.FileLoadException: 未能載入文件或程式集“EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一個依賴項。找到的程式集清單定義與程式集引用不匹配。(異常來自 HRESULT: 0x80131040) | 這通常表示您正在沒有 Redirect.config 文件的情況下運行 .NET 4 應用程式。您需要將 Redirect.config 複製到 migrate.exe 所在的位置,並將其重命名為 migrate.exe.config。 |
未經處理的異常: System.IO.FileLoadException: 未能載入文件或程式集“EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一個依賴項。找到的程式集清單定義與程式集引用不匹配。(異常來自 HRESULT: 0x80131040) ---> System.IO.FileLoadException: 無法載入 文件或程式集“EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一個依賴項。找到的程式集清單定義與程式集引用不匹配。(異常來自 HRESULT: 0x80131040) |
此異常表示您在將 Redirect.config 複製到 migrate.exe 所在位置的情況下運行 .NET 4.5 應用程式。如果應用程式是 .NET 4.5,則無需內部有重定向的配置文件。刪除 migrate.exe.config 文件。 |
錯誤: 無法將資料庫更新為與當前模型,因為存在待定更改並且禁用了自動遷移。將待定模型更改寫入基於代碼的遷移或啟用自動遷移。將 DbMigrationsConfiguration.AutomaticMigrationsEnabled 設置為 true,啟用自動遷移。 | 如果在創建遷移以處理對模型所做的更改之前運行遷移,並且資料庫與模型不匹配,會發生此錯誤。這種錯誤的一個示例是向模型類添加屬性,然後在不創建遷移以升級資料庫的情況下運行 migrate.exe。 |
錯誤: 沒有為成員“System.Data.Entity.Migrations.Design.ToolingFacade+UpdateRunner,EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”解析類型。 | 此錯誤可能是因指定不正確的啟動目錄造成的。此目錄必須是 migrate.exe 所在的位置 |
未經處理的異常: System.NullReferenceException: 對象引用未設置為某個對象的實例。 在 System.Data.Entity.Migrations.Console.Program.Main(String[] args) 處 |
此錯誤可能是因沒有為要使用的方案指定所需參數引起的。例如,指定了一個連接字元串,但沒有指定提供程式名稱。 |
錯誤: 在程式集“ClassLibrary1”中找到多個遷移配置類型。請指定要使用的遷移配置類型的名稱。 | 正如錯誤所描述的,給定程式集中有多個配置類。必須使用 /configurationType 開關來指定要使用的配置類。 |
錯誤: 未能載入文件或程式集“<assemblyName>”或它的某一個依賴項。給定程式集名稱或基本代碼無效。(異常來自 HRESULT: 0x80131047) | 此錯誤可能是因錯誤指定程式集名稱或沒有程式集名稱引起的 |
錯誤: 未能載入文件或程式集“<assemblyName>”或它的某一個依賴項。嘗試載入格式不正確的程式。 | 如果嘗試對 x64 應用程式運行 migrate.exe,會發生這種情況。EF 5.0 及更低版本僅對 x86 有效。 |