如何在Visual Studio Online上运行Entity Framework的migrate.exe?

6
我已经使用Visual Studio Online的构建定义为我的项目设置了持续集成。
在将数据库部署到Azure测试环境时,我只需按照正确的发布设置构建SQL Server数据库项目即可。
但我想切换到Entity Framework的代码优先方法并利用迁移功能,这需要我调用migrate.exe。
我的问题是 - 我该如何从VSO构建定义中运行migrate.exe?

你正在使用哪个构建系统?vNext 还是 XAML? - Eddie Chen - MSFT
我正在使用vNext。谢谢! - user11081980
3个回答

10

我们已经成功地在TFS Build vNext上实现了自动化的EF Code First迁移部署,具体实现方式如下:

基本上它包括3个步骤(每个EF-context):

  1. 将EF项目复制到一个临时目录中
  2. 在同一个文件夹中复制migrate.exe(migrate.exe需要放置在包含EF迁移的程序集旁边
  3. 执行migrate.exe

详细步骤如下:

  1. 复制文件 "task"
    • 源文件夹:$(build.sourcesdirectory)
    • 内容:Contoso.EF\bin\debug\ **
    • 目标文件夹:$(build.artifactstagingdirectory)/EF
  2. 复制文件 "task"
    • 源文件夹:$(build.sourcesDirectory)\packages\EntityFramework.6.1.3\tools
    • 内容:migrate.exe
    • 目标文件夹:$(build.artifactstagingdirectory)\EF\Contoso.EF\bin\debug\bin\debug
  3. 批处理脚本 "task"
    • 路径:$(build.sourcesdirectory)_Deploy\MigrateEFContext.bat
    • 参数:$(build.artifactstagingdirectory)\EF\Contoso.EF\bin\debug Contoso.EF.dll [SQL-SERVER-INSTANCE] [DbName] System.Data.SqlClient

MigrateEFContext.bat文件会将migrate.exe命令和其参数组装起来:

SET EFDir=%1
SET EFContext=%2
SET connStringDataSource=%3
SET connStringInitialCatalog=%4
SET connectionProviderName=%5

%EFDIR%\migrate.exe %EFContext% /ConnectionString:"Data Source=%connStringDataSource%;Initial Catalog=%connStringInitialCatalog%;Integrated Security=true" /connectionProviderName:%connectionProviderName% /verbose

Azure DevOps是否也适用于此,或者现在有更简单的方法吗? - Albert
@Albert:同样的,不幸的是。 - DdW

7
我假设您正在使用vNext版本构建,首先在构建定义中添加“Nuget Installer”任务以便在构建期间还原Entity Framework。Migrate.exe将安装在\packages\EntityFramework.\tools文件夹中。接下来,添加一个“命令行”任务以运行migrate.exe。在“工具”区域输入“\packages\EntityFramework.\tools\migrate.exe”,在“参数”字段中输入参数。

3
据我所知,在命令行任务中无法使用通配符。那么如何从 EF 版本中移除依赖呢? - alexey
我遇到了以下错误。有什么想法吗?无法加载文件或程序集“EntityFramework,Version = 6.0.0.0”,正在vNext构建系统上运行。 - TWilly
@TWilly 请参考以下链接了解如何使用 migrate.exe 工具:https://msdn.microsoft.com/zh-cn/data/jj618307.aspx - Eddie Chen - MSFT

2

你也可以在应用程序启动时执行迁移。

将以下内容添加到global.asax中的Application_Start()事件中。

var configuration = new Configuration();
var migrator = new DbMigrator(configuration);
migrator.Update();

这将在每次应用程序启动时触发迁移。你也可以使用条件逻辑进行包装,以控制其触发方式。

是的。如此描述 https://blogs.msdn.microsoft.com/webdev/2014/04/08/ef-code-first-migrations-deployment-to-an-azure-cloud-service/ - JackMorrissey
5
我认为这是一种非常危险的方法,因为在第一次访问你的网站时你不会知道迁移问题。我肯定会主张将数据库的特定升级步骤作为明确的步骤来执行。 - The Senator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接