使用 migrate.exe

代码优先迁移可用于从 Visual Studio 内部更新数据库,但也可以通过命令行工具 migrate.exe执行。 本页将快速概述如何使用 migrate.exe 针对数据库执行迁移。

注释

本文假定你知道如何在基本场景中使用 Code First 迁移。 如果没有,则需要先阅读 Code First 迁移,然后再继续进行。

复制 migrate.exe

使用 NuGet 安装 Entity Framework 时,migrate.exe 将位于下载包的工具文件夹中。 在 <项目文件夹>\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
.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) 这通常意味着在没有 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) 此异常意味着运行一个 .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。