使用 migrate.exe

Code First 迁移可用于从 Visual Studio 内部更新数据库,但也可通过命令行工具 migrate.exe 进行执行。 本页将简要概述如何使用 migrate.exe 对数据库执行迁移。

注意

本文假设你了解如何在基本场景中使用 Code First 迁移。 如果你不知道,则需要先阅读 Code First 迁移,再继续。

复制 migrate.exe

使用 NuGet migrate.exe 安装实体框架时,migrate.exe 位于已下载包的工具文件夹中。 位于 <project folder>\packages\EntityFramework.<version>\tools 中

创建 migrate.exe 后,需要将其复制到包含迁移的程序集的位置。

如果应用程序面向 .NET 4,而不是 4.5,则还需要将 Redirect.config 复制到位置,并将其重命名为 migrate.exe.config。这样,migrate.exe 才能获取正确的绑定重定向,以便找到实体框架程序集

.NET 4.5 .NET 4.0
.NET 4.5 Files .NET 4.0 Files

注意

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: 对象引用未设置为对象的实例。
   位于 System.Data.Entity.Migrations.Console.Program.Main(String[] args)
导致此错误的原因可能是没有为使用的场景指定所需的参数。 例如,指定连接字符串而没有指定提供程序名称。
错误:程序集“ClassLibrary1”中找到多个迁移配置类型。 请指定要使用的名称。 如错误消息所述,给定程序集中存在多个配置类。 必须使用 /configurationType 开关来指定要使用哪个。
错误:未能加载文件或程序集“<assemblyName>”或它的某个依赖项。 给定的程序集名称或代码库无效。 (HRESULT 中的异常:0x80131047) 导致错误的原因可能是错误地指定了程序集名称,或者没有指定程序集名称
错误:未能加载文件或程序集“<assemblyName>”或它的某个依赖项。 试图加载的程序的格式不正确。 如果尝试对 x64 应用程序运行 migrate.exe,则会发生此情况。 EF 5.0 及以下版本仅适用于 x86。