使用 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 |
---|---|
注意
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。 |