DacFx DeploymentPlanExecutor OnExecute not called

本文关键字:called not OnExecute DeploymentPlanExecutor DacFx | 更新日期: 2023-09-27 18:33:14

我正在尝试使用Microsoft的DacFx 3.0编写自定义DeploymentPlanExecutor,但从未调用OnExecute -Method。

  • 如果我改用相同的DeploymentPlanModifier,则会按预期调用OnExecute()
  • 无论我添加执行器、修饰符还是两者,DAC 实际上都已成功部署到数据库。
  • 执行程序似乎在部署期间被识别,因为调用OnApplyDeploymentConfiguration()

不幸的是,我找不到任何使用DeploymentPlanExecutor的示例(只有带有DeploymentPlanModifier的示例(,并且DacFx的文档根本没有帮助。

我的问题是,为什么DeploymentPlanExecutor中的OnExecute()没有被调用,我该如何解决这个问题?

我的DeploymentPlanExecutorDeploymentPlanExecutor的代码:

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 DeploymentPlanExecutor OnExecute not called

问题是,你必须明确告诉DacFx使用执行器。不过,默认情况下启用修饰符。

dacDeployOptions.RunDeploymentPlanExecutors = true;