gpt4 book ai didi

c# - 如何在 DacServices.Deploy() 中禁用部署前和部署后脚本

转载 作者:行者123 更新时间:2023-11-30 21:41:43 25 4
gpt4 key购买 nike

我们有一些自动化的 dacpac 部署代码,可以使用 Microsoft.SqlServer.Dac 在 C# 中正确处理 CreateNewDatabase 和直接更新数据库场景

现在,在 CreateNewDatabase 案例中,我们希望能够在禁用部署前脚本和部署后脚本的情况下运行 DacServices.Deploy()。 IE。在这种情况下不应执行它们。

我试图在 DacDeployOptionsDacServices 对象中找到合适的位置,但找不到任何可以做到这一点的地方。理想情况下

问题 1:我想要像 DacDeployOptions.IgnorePreDeploymentScript = true 这样的东西,有什么方法可以在运行时实现吗?

作为替代方案,我记得前段时间看到示例代码显示如何遍历 dacpac 并在运行时创建新的 dacpac。我认为这种方法可以让我简单地创建一个新的 dacpac,我可以将其传递给 Deploy 并且排除部署前和部署后脚本。我不喜欢这个解决方案,但它可以让我实现我所需要的。

问题 2:谁能给我指出一些例子吗?

我的代码:

var dacService = new DacServices(ConstDefaultConnectionString);
using (var dacPackage = DacPackage.Load(dacPacFilePath))
{
var deployOptions = new DacDeployOptions
{
CreateNewDatabase = true,
IncludeTransactionalScripts = false
};
dacService.Deploy(dacPackage, TestDatabaseName, true, deployOptions);
}

问题是关于:Create LocalDB for testing from Visual Studio SQL project

最佳答案

为此您可以采取多种方法,这有点脑残(嘿,昨晚时钟倒退了,我什至不确定当前时间是否正确):

1) 使用相同的数据库引用创建一个引用您的主项目的空项目 - 当您在没有脚本的情况下部署时使用 IncludeCompositeObjects 部署空项目 - 部署前/后脚本仅从您部署的 dacpac 运行,而不是从任何引用的dacpacs 但显然代码和方案已部署。这是这样描述的:

https://the.agilesql.club/blog/Ed-Elliott/2016-03-03/Post-Deploy-Scripts-In-Composite-Dacpac-not-deploying

2) 使用 SQLCMD 变量包装数据设置并将值传递给部署。

3) 让你的脚本检查它们是否应该设置数据,比如只在表行数为零时才插入

4) 对于引用数据使用合并脚本——我不清楚这是为了引用数据还是设置测试数据

5) 使用 .net 打包 api 从 dacpac 中删除部署前/后脚本,这向您展示了如何编写脚本,以便您应该能够执行 GetPart 而不是 WritePart:

https://github.com/GoEddie/Dir2Dac/blob/master/src/Dir2Dac/DacCreator.cs

总的来说,我猜想可能有一个更简单的解决方案——如果这是为了测试,那么也许可以将数据设置作为测试设置的一部分?如果您正在进行单元测试,tSQLt 可以通过使用 FakeTable 帮助您避免这一切。

希望对您有所帮助:)

埃德

关于c# - 如何在 DacServices.Deploy() 中禁用部署前和部署后脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43022266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com