我目前正在尝试使用 migrate.exe 工具通过命令行运行我的迁移。
我的项目结构如下:
MyProject.WebAPI - 我的 API 项目,它访问存储库中的方法
MyProject.Repositories - 负责所有数据库工作的项目,包括迁移文件的存储位置、上下文的配置以及配置类的保存位置
运行 WebAPI 项目时迁移工作正常,因为 DB 初始化程序在 Application_Start 中设置如下:
Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, MyProject.Repositories.Migrations.Configuration>());
不想再这样做的原因是当我将代码安装到机器上时。我的目标是在安装时初始化数据库,因此需要能够从命令行运行迁移。为此,我migrate.exe
在 WebApi 项目的 bin 目录中获得了一份副本,以及MyProject.Repositories.dll
.
因此,我希望能够使用 WebApi 项目中的 web.config 文件来配置和运行初始化程序。其实体框架部分如下所示:
<configuration>
....
<connectionStrings>
<add name="MyConnectionString" connectionString="..." providerName="System.Data.SqlClient" />
</connectionStrings>
<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
<contexts>
<context type="Repositories.MyContext, MyProject.Repositories">
<databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Repositories.MyContext, MyProject.Repositories], [Repositories.Configuration, MyProject.Repositories]], EntityFramework">
</databaseInitializer>
</context>
</contexts>
</entityFramework>
</configuration>
我正在运行 migrate.exe,如下所示:
migrate.exe MyProject.Repositories.dll /startUpDirectory:"%current%" /connectionStringName:MyConnecitonString /startUpConfigurationFile:"%parent%\web.config"
current 和 parent 只是在批处理文件中设置的变量。
运行此设置时,我收到以下错误:
ERROR: Failed to set database initializer of type 'System.Data.Entity.MigrateDatabaseToLatestVersion`2[[MyProject.CampaignManagerContext, MyProject.Repositories], [Repositories.Configuration, MyProject.Repositories]], EntityFramework'
for DbContext type 'Repositories.MyContext, MyProject.Repositories' specified in the application configuration. See inner exception for details.
这是否可以在两个项目之间进行,还是我必须在实际的 Repositories 项目本身上运行它,使用它自己的 app.config?
编辑:我一直在做更多的工作,并且已经改变了我对迁移的要求:
migrate.exe MyProject.Repositories.dll /connectionString:MyConnectionString /connectionProviderName:System.Data.SqlClient
这给了我一个错误:
ERROR: Format of the initialization string does not conform to specification starting at index 0.
看来离上班越来越近了……