Entity Framework 迁移 Azure DevOps 发布管道

Entity Framework Migration Azure DevOps Release Pipeline

我正在尝试 运行 在 Azure DevOps 发布管道上迁移。因为我想在每次发布时自动 运行 我的数据库脚本。我的发布管道没有源代码,我只有编译的 DLL。

当我在我的本地机器上执行这个命令时,它 运行 成功了。我如何转换此命令以便我可以将其与 DLL 一起使用。

dotnet ef database update --project MyEntityFrameworkProject --context MyDbContext --startup-project MyStartupProject

如果您不想将您的源代码包含在工件中,您可以使用以下脚本:

set rootDir=$(System.DefaultWorkingDirectory)\WebApp\drop\WebApp.Web
set efPath=C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.entityframeworkcore.tools.1.1\tools\netcoreapp2.0\any\ef.dll
dotnet exec --depsfile "%rootDir%\WebApp.deps.json" --additionalprobingpath %USERPROFILE%\.nuget\packages --additionalprobingpath "C:\Program Files\dotnet\sdk\NuGetFallbackFolder" --runtimeconfig "%rootDir%\WebApp.runtimeconfig.json" "%efpath%" database update --verbose --prefix-output --assembly "%rootDir%\AssemblyContainingDbContext.dll" --startup-assembly "%rootDir%\AssemblyContainingStartup.dll" --working-dir "%rootDir%"

事实证明,您可以像下面的示例一样使用未记录的 dotnet exec 命令(假设 Web 应用程序称为 WebApp):

请注意,此 运行 命令行任务的工作目录(隐藏在高级下)必须设置为工件所在的位置(上面的 rootDir)。

另一种选择是安装 Build & Release Tools 扩展并使用 "Deploy Entity Framework Core Migrations from a DLL" 任务。

您可以阅读更多信息here, here and here

另一种方法是在构建管道期间生成迁移脚本(常规 sql 脚本)并使该脚本成为您的工件的一部分。为此 运行 以下命令:

dotnet ef migrations script --output $(build.artifactstagingdirectory)\sql\migrations.sql -i

注意 -i 标志,它使该脚本 运行 在同一个数据库上可以多次使用

将此脚本作为工件的一部分后,您可以使用 Azure SQL Database Deployment 内置任务将其 运行 放在发布管道的数据库中。

查看this link了解更多信息

编辑:正如@PartickBorkowicz 所指出的,从 Build/Release Agent 的角度来看,存在一些与数据库无法以常规方式可用的事实相关的问题。这里有一些额外的提示,如何在没有数据库和连接字符串存储在代码中的任何地方的情况下生活。

1.构建管道

如果您什么都不做,构建代理将需要数据库连接才能 运行 dotnet ef migrations script 脚本。但是有一个技巧可以让你在没有数据库和连接字符串的情况下工作:IDesignTimeDbContextFactory

这样创建 class 就足够了:

public class YourDesignTimeContextFactory : IDesignTimeDbContextFactory<YourDbContext>
{
    public YourDbContext CreateDbContext(string[] args)
    {
        var databaseConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;Initial Catalog=LocalDB;Integrated Security=True;Pooling=False";
        var builder = new DbContextOptionsBuilder<YourDbContext>();
        builder.UseSqlServer(databaseConnectionString);

        return new YourDbContext(builder.Options);
    }
}

一旦它出现在您的项目中(无论如何您都不需要注册),您的构建代理将能够生成 sql 具有迁移逻辑的脚本,而无需访问实际数据库

2。发布管道

现在,您正在生成 sql 脚本并成为构建管道中工件的一部分。现在,发布管道是您希望此脚本在实际数据库上 运行 的时间 - 您将需要以某种方式连接到该数据库的连接字符串。要以安全的方式执行此操作,您不应将其存储在代码中的任何位置。一个好的方法是将密码保存在 Azure Key Vault 中。 Azure 发布管道中有一个名为 Azure Key Vault. This will fetch your secrets which you can use in next step: Azure SQL Database Deployment 的内置任务。您只需要设置选项:

AuthenticationType: Connection String
ConnectionString: `$(SqlServer--ConnectionString)` - this value depends on your secret name in Key Vault
Deploy type: SQL Script File
SQL Script: $(System.DefaultWorkingDirectory)/YourProject/drop/migrations/script.sql - this depends how you setup your artifact in build pipeline.

通过这种方式,您可以在不访问数据库的情况下生成迁移,并且 运行 迁移 sql 无需将连接字符串存储在代码中的任何位置。