另一种方法是在构建管道期间生成迁移脚本(常规 sql 脚本),并使该脚本成为您的工件的一部分。为此,请运行以下命令:
dotnet ef migrations script --output $(build.artifactstagingdirectory)\sql\migrations.sql -i
注意 -i 标志,这使得该脚本可以在同一个数据库上多次运行
将此脚本作为工件的一部分后,您可以使用内置任务Azure SQL Database Deployment 在发布管道中的数据库上运行它。
查看this link了解更多信息
编辑:正如@PartickBorkowicz 指出的那样,从构建/发布代理的角度来看,数据库无法以常规方式使用这一事实存在一些问题。这里有一些额外的提示,如何在没有数据库和连接字符串存储在代码中的任何地方生活。
1.构建管道
如果您什么都不做,构建代理将需要数据库连接才能运行dotnet ef migrations script 脚本。但是有一个技巧可以让你在没有数据库和连接字符串的情况下工作:IDesignTimeDbContextFactory
这样创建类就足够了:
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 的内置任务。这将获取您可以在下一步中使用的秘密: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,而无需将连接字符串存储在代码中的任何位置。