sup*_*ero 10 entity-framework azure-devops azure-pipelines azure-pipelines-release-pipeline entity-framework-migrations
我正在尝试在 Azure DevOps Release Pipeline 上运行迁移。因为我想在每个版本上自动运行我的数据库脚本。我的发布管道没有源代码,我只是编译了 DLL。
当我在本地机器上执行此命令时,它运行成功。如何转换此命令以便我可以将它与 DLL 一起使用。
dotnet ef database update --project MyEntityFrameworkProject --context MyDbContext --startup-project MyStartupProject
Tom*_*ski 18
另一种方法是在构建管道期间生成迁移脚本(常规 sql 脚本)并使该脚本成为您的工件的一部分。为此,请运行以下命令:
dotnet ef migrations script --output $(build.artifactstagingdirectory)\sql\migrations.sql -i
注意-i
标志使此脚本可在同一数据库上多次运行
将此脚本作为工件的一部分后,您可以使用Azure SQL Database Deployment
内置任务在发布管道中的数据库上运行它。
检查此链接以获取更多信息
编辑:正如@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);
}
}
Run Code Online (Sandbox Code Playgroud)
一旦它出现在您的项目中(无论如何您都不需要注册它),您的构建代理将能够生成带有迁移逻辑的 sql 脚本,而无需访问实际数据库
2. 发布管道
现在,您正在生成 sql 脚本并成为构建管道中工件的一部分。现在,发布管道是您希望此脚本在实际数据库上运行的时间 - 您需要以某种方式连接到此数据库的字符串。要以安全的方式执行此操作,您不应将其存储在代码中的任何位置。一个很好的方法是将密码保存在 Azure Key Vault 中。Azure 发布管道中有一个内置任务,称为Azure Key Vault。这将获取您可以在下一步中使用的机密:Azure SQL 数据库部署。您只需要设置选项:
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.
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您无需访问数据库即可生成迁移并运行迁移 sql,而无需在代码中的任何位置存储连接字符串。
如果您不想将源代码包含在工件中,可以使用以下脚本:
set rootDir=$(System.DefaultWorkingDirectory)\WebApp\drop\WebApp.Web
set efPath=C:\Program Files\dotnet\sdk\NuGetFallbackFolder\microsoft.entityframeworkcore.tools\2.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%"
Run Code Online (Sandbox Code Playgroud)
事实证明,您可以使用未记录的 dotnet exec 命令,如下例所示(假设 Web 应用程序称为 WebApp):
请注意,此运行命令行任务的工作目录(隐藏在“高级”下)必须设置为工件所在的位置(上面的 rootDir)。
另一种选择是安装构建和发布工具扩展并使用“从 DLL 部署 Entity Framework Core 迁移”任务。
归档时间: |
|
查看次数: |
9307 次 |
最近记录: |