在我的解决方案中,我有一个包含多个Entity Framework 6.1.3迁移配置类的Data项目。我的目标是从TeamCity(或者,为了简化,从命令行)运行实体框架迁移步骤,其中一个步骤是针对现有数据库。
我使用的迁移配置类如下:
namespace MyProject.Data
{
public partial class MyCustomMigrationConfiguration :
DbMigrationsConfiguration<MyCustomContext>
{
public MyCustomMigrationConfiguration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = true;
MigrationsDirectory = @"MigrationsMyCustomContextMigrationSteps";
}
}
}
我可以从Visual Studio中的包管理器控制台成功运行以下命令:
更新数据库-Verbose-StartUpProject Web-ConnectionString'-my此处的连接字符串-'-ConfigurationTypeNameMyCustomMigrationConfiguration-ConnectionProviderName"System.Data.SqlClient"
我想从命令行做同样的事情,所以我运行这个:
migrate.exe MyProject.Data.dll"MyCustomMigrationConfiguration"/startUpConfigurationFile=MyProject.Web.dll.config/connectionString="-此处为我的连接字符串-;"/connectionProviderName="System.Data.SqlClient"/verbose
然而,我得到以下错误:
错误:迁移配置类型在程序集中找不到MyCustomMigrationConfiguration"MyProject.Data".
关于如何解决这个问题,有什么建议吗?
您可以指定运行代码所需的所有依赖项(程序集)所在的目录。您可以使用/startUpDirectory
选项,如下所述:
指定工作目录
Migrate.exe MyApp.exe /startupConfigurationFile=”MyApp.exe.config” /startupDirectory=”c:MyApp”
如果程序集具有依赖项或读取相对于工作目录的文件,则需要设置startupDirectory。
找到了解决方案(我最终从http://entityframework.codeplex.com/以及调试迁移控制台应用程序)。
显然,MyProject.Data.dll的所有依赖项都需要与它和migrate.exe复制到同一个文件夹中,否则Entity Framework migrate.exe工具将抛出上面的误导性错误消息。
在这种情况下,实体框架确实可以使用更好的错误处理和更清晰的错误消息。
作为对实体框架devs的引用:TypeFinder.cs中的以下代码返回了null类型,因为MyProject.Data.dll的依赖项没有复制到migrate.exe的文件夹中:
type = _assembly.GetType(typeName, false);