3

DeploymentPlanExecutorMicrosoft の DacFx 3.0 を使用してカスタムをプログラムしようとしていますが、 OnExecute-Method が呼び出されません。

  • DeploymentPlanModifier代わりに同一のものを使用するOnExecute()と、期待どおりに呼び出されます。
  • Executor、Modifier、またはその両方を追加するかどうかに関係なく、DAC は実際にデータベースに正常にデプロイされます。
  • ExecutorOnApplyDeploymentConfiguration()が呼び出されるため、Deployment 中に認識されるようです

残念ながら、を使用する例を見つけることができずDeploymentPlanExecutor(を使用した例のみDeploymentPlanModifier)、DacFx のドキュメントはまったく役に立ちません。

私の質問は、なぜOnExecute()呼び出されないのDeploymentPlanExecutorですか、どうすればこれを修正できますか?

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);
}
4

1 に答える 1

3

問題は、DacFx に Executor を使用するように明示的に指示する必要があることでした。ただし、修飾子はデフォルトで有効になっています。

dacDeployOptions.RunDeploymentPlanExecutors = true;

于 2016-02-10T12:04:09.980 に答える