未调用 DacFx DeploymentPlanExecutor OnExecute
DacFx DeploymentPlanExecutor OnExecute not called
我正在尝试使用 Microsoft 的 DacFx 3.0 编写自定义 DeploymentPlanExecutor
,但从未调用 OnExecute
-方法。
- 如果我改用相同的
DeploymentPlanModifier
,则会按预期调用 OnExecute()
。
- 无论我添加Executor、Modifier 还是两者,DAC 实际上都已成功部署到数据库中。
- Executor 似乎在部署期间被识别,因为
OnApplyDeploymentConfiguration()
被调用
不幸的是,我找不到任何使用 DeploymentPlanExecutor
的示例(只有使用 DeploymentPlanModifier
的示例)并且 DacFx 的文档根本没有帮助。
我的问题是,为什么 DeploymentPlanExecutor
中的 OnExecute()
没有被调用,我该如何解决这个问题?
我的 DeploymentPlanExecutor
和 DeploymentPlanExecutor
的代码:
using System.Collections.Generic;
using Microsoft.SqlServer.Dac.Deployment;
namespace DacTest
{
// The executor that does not work as expected
[ExportDeploymentPlanExecutor(ContributorId, "1.0.0.0")]
public class Executor : DeploymentPlanExecutor
{
public const string ContributorId = "DacTest.Executor";
protected override void OnApplyDeploymentConfiguration(DeploymentContributorContext context, ICollection<DeploymentContributorConfigurationStream> configurationStreams)
{
// Called
}
protected override void OnEstablishDeploymentConfiguration(DeploymentContributorConfigurationSetup setup)
{
// Not called
}
protected override void OnExecute(DeploymentPlanContributorContext context)
{
// Not called!
}
}
// The modifier that does work as expected
[ExportDeploymentPlanModifier(ContributorId, "1.0.0.0")]
public class Modifier : DeploymentPlanModifier
{
public const string ContributorId = "DacTest.Modifier";
protected override void OnApplyDeploymentConfiguration(DeploymentContributorContext context, ICollection<DeploymentContributorConfigurationStream> configurationStreams)
{
// Called
}
protected override void OnEstablishDeploymentConfiguration(DeploymentContributorConfigurationSetup setup)
{
// Not called
}
protected override void OnExecute(DeploymentPlanContributorContext context)
{
// Called!
}
}
}
调用部署的代码(必须在不同的程序集中):
using (DacPackage dacpac = DacPackage.Load(@"C:\Temp\dac.dacpac"))
{
DacDeployOptions dacDeployOptions = new DacDeployOptions();
dacDeployOptions.AdditionalDeploymentContributors = Executor.ContributorId; // + ";" + Modifier.ContributorId;
DacServices dacServices = new DacServices(connectionString);
dacServices.Deploy(dacpac, databaseName, true, dacDeployOptions);
}
问题是,您必须明确告诉 DacFx 使用执行器。不过默认情况下会启用修饰符。
dacDeployOptions.RunDeploymentPlanExecutors = true;
我正在尝试使用 Microsoft 的 DacFx 3.0 编写自定义 DeploymentPlanExecutor
,但从未调用 OnExecute
-方法。
- 如果我改用相同的
DeploymentPlanModifier
,则会按预期调用OnExecute()
。 - 无论我添加Executor、Modifier 还是两者,DAC 实际上都已成功部署到数据库中。
- Executor 似乎在部署期间被识别,因为
OnApplyDeploymentConfiguration()
被调用
不幸的是,我找不到任何使用 DeploymentPlanExecutor
的示例(只有使用 DeploymentPlanModifier
的示例)并且 DacFx 的文档根本没有帮助。
我的问题是,为什么 DeploymentPlanExecutor
中的 OnExecute()
没有被调用,我该如何解决这个问题?
我的 DeploymentPlanExecutor
和 DeploymentPlanExecutor
的代码:
using System.Collections.Generic;
using Microsoft.SqlServer.Dac.Deployment;
namespace DacTest
{
// The executor that does not work as expected
[ExportDeploymentPlanExecutor(ContributorId, "1.0.0.0")]
public class Executor : DeploymentPlanExecutor
{
public const string ContributorId = "DacTest.Executor";
protected override void OnApplyDeploymentConfiguration(DeploymentContributorContext context, ICollection<DeploymentContributorConfigurationStream> configurationStreams)
{
// Called
}
protected override void OnEstablishDeploymentConfiguration(DeploymentContributorConfigurationSetup setup)
{
// Not called
}
protected override void OnExecute(DeploymentPlanContributorContext context)
{
// Not called!
}
}
// The modifier that does work as expected
[ExportDeploymentPlanModifier(ContributorId, "1.0.0.0")]
public class Modifier : DeploymentPlanModifier
{
public const string ContributorId = "DacTest.Modifier";
protected override void OnApplyDeploymentConfiguration(DeploymentContributorContext context, ICollection<DeploymentContributorConfigurationStream> configurationStreams)
{
// Called
}
protected override void OnEstablishDeploymentConfiguration(DeploymentContributorConfigurationSetup setup)
{
// Not called
}
protected override void OnExecute(DeploymentPlanContributorContext context)
{
// Called!
}
}
}
调用部署的代码(必须在不同的程序集中):
using (DacPackage dacpac = DacPackage.Load(@"C:\Temp\dac.dacpac"))
{
DacDeployOptions dacDeployOptions = new DacDeployOptions();
dacDeployOptions.AdditionalDeploymentContributors = Executor.ContributorId; // + ";" + Modifier.ContributorId;
DacServices dacServices = new DacServices(connectionString);
dacServices.Deploy(dacpac, databaseName, true, dacDeployOptions);
}
问题是,您必须明确告诉 DacFx 使用执行器。不过默认情况下会启用修饰符。
dacDeployOptions.RunDeploymentPlanExecutors = true;