使用 migrate.exe
Code First 移轉可用來從 Visual Studio 內部更新資料庫,但也可以透過命令列工具 migrate.exe 來執行。 此頁面將快速概觀如何使用 migrate.exe 對資料庫執行移轉。
注意
本文假設您知道如何在基本案例中使用Code First 移轉。 如果您未這麼做,則必須先閱讀 Code First 移轉 再繼續。
複製 migrate.exe
當您使用 NuGet migrate.exe 安裝 Entity Framework 時,將會位於所下載套件的工具資料夾中。 在 < 專案資料夾 > \packages\EntityFramework 中。 <version > \tools
一旦您擁有 migrate.exe,您必須將它複製到包含移轉的元件位置。
如果您的應用程式以 .NET 4 為目標,而不是 4.5,則您也必須將 Redirect.config 複製到 位置,並將它 重新命名為 migrate.exe.config 。 如此一來,migrate.exe 會取得正確的系結重新導向,以找出 Entity Framework 元件。
.NET 4.5 | .NET 4.0 |
---|---|
注意
migrate.exe 不支援 x64 元件。
將 migrate.exe 移至正確的資料夾之後,您應該能夠用它來對資料庫執行移轉。 所有公用程式的設計都是執行移轉。 它無法產生移轉或建立 SQL 腳本。
請參閱選項
Migrate.exe /?
上述會顯示與此公用程式相關聯的說明頁面,請注意,您必須將 EntityFramework.dll 放在您執行 migrate.exe 的相同位置,才能運作。
移轉至最新的移轉
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) | 這通常表示您執行 .NET 4 應用程式時沒有 Redirect.config 檔案。 您必須將 Redirect.config 複製到與 migrate.exe 相同的位置,並將它重新命名為 migrate.exe.config。 |
未處理的例外狀況:System.IO.FileLoadException:無法載入檔案或元件 'EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' 或其其中一個相依性。 找到的元件資訊清單定義不符合元件參考。 (HRESULT 例外:0x80131040) | 這個例外狀況表示您正在執行 .NET 4.5 應用程式,並將 Redirect.config 複製到 migrate.exe 位置。 如果您的應用程式是 .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:物件參考未設定為物件的實例。 at System.Data.Entity.Migrations.Console.Program.Main(String[] args) |
這可能會因為未針對您使用的案例指定必要的參數所造成。 例如,指定連接字串而不指定提供者名稱。 |
錯誤:元件 'ClassLibrary1' 中找到多個移轉組態類型。 指定要使用的名稱。 | 當錯誤狀態時,指定元件中有多個組態類別。 您必須使用 /configurationType 參數來指定要使用的參數。 |
錯誤:無法載入檔案或元件 ' < assemblyName > ' 或其其中一個相依性。 指定的元件名稱或程式碼基底無效。 (HRESULT 例外:0x80131047) | 這可能是因為指定元件名稱不正確或沒有 |
錯誤:無法載入檔案或元件 ' < assemblyName > ' 或其其中一個相依性。 嘗試載入了格式不正確的程式。 | 如果您嘗試對 x64 應用程式執行 migrate.exe,就會發生這種情況。 EF 5.0 和以下版本只能在 x86 上運作。 |