CRM 4到2016迁移,插件事件

时间:2017-01-20 12:22:24

标签: dynamics-crm dynamics-crm-4 dynamics-crm-2016

我正在将CRM 4迁移到2016年,我需要澄清一些关于插件执行的内容。在两个CRM版本中,我们都有帐户和报价实体。要引用的帐户与父母关系1:N相关联。在CRM 4中,当您将帐户分配给不同的所有者时,第一个Assign和下一个Update邮件被触发,但仅限于帐户实体。

在CRM 2016中,我观察到Update(仅更新 - 未分配)消息也会在引用(以及其他子实体,如果relation设置为parental)上触发。此外,如果引用具有与父母关系相关联的子实体,则会对此子实体触发Update消息,依此类推。有没有办法在插件中识别这种情况(级联更新)?

2 个答案:

答案 0 :(得分:1)

应该有一个父上下文引用事件源。您可以将$stateProvider .state('app.state', { url: '/state-modal', template: '<ui-view></ui-view>', controller: 'DummyCtrl', controllerAs: 'dummy', onEnter: appState_onEnter }); // or use /** @ngInject */ aswell appState_onEnter.$inject = ['$uibModal']; function appState_onEnter(AppModals) { AppModals.open({ templateUrl: 'modals/state-modal.html', controller: 'DummyCtrl', controllerAs: 'dummy' }); } 属性遍历回根目录以查找触发器的来源。当你在那里找不到它时(例如,当混合同步和异步操作时),我没有其他选择。

从技术上讲,相关实体的更新是在插件的子管道中执行的。在CRM 4.0中,我们只能在IPluginExecutionContext.ParentContextCreateUpdate消息的子管道中注册插件步骤。在CRM 2011中,事件模型被简化了#39;从那个版本开始,就不再可能指定管道了。相反,DeletePreOperationPostOperation消息的CreateUpdate阶段注册的插件始终在子管道中注册。

答案 1 :(得分:0)

此问题有两种解决方案。第一个,我认为这是我应该如何从一开始就使用Filtering attributes。正如您可以阅读here那样:

  

实体属性列表,更改后会导致插件执行。如果任何属性发生更改,则null值会导致插件执行。

其次是部分使用Henk提到的ParentContext - 感谢您指出了正确的方向!您必须按照以下方法进行检查。如果有人想使用这种方法,应该记得先测试一下。它适用于我的情况和我的插件,但你的插件可能会在不同的步骤,消息和实体上注册,这种方法可能不适合你。

public static Boolean IsInternalParentAssign(IPluginExecutionContext context)
{
    Boolean result = false;
    if (context.ParentContext != null)
    {
        IPluginExecutionContext parentContext = context.ParentContext;
        if (parentContext.MessageName == "Assign" 
            && context.Depth == 1
            && parentContext.PrimaryEntityId != context.PrimaryEntityId)
        {
            result = true;
        }
    }
    return result;
}