CRM 4 到 2016 迁移,插件事件



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

在CRM 2016中,我观察到Update(仅更新 - 不分配)消息也会在引号(如果关系设置为父实体)上触发。此外,如果报价具有与父关系连接的子实体,则会在此子实体上触发Update消息,依此类推。有没有办法在插件中识别这种情况(级联更新)?

应该有一个引用事件源的父上下文。可以将 IPluginExecutionContext.ParentContext 属性遍历回根目录,以找出触发器的来源。当您在那里找不到它时(例如,当同步和异步操作混合时),恐怕没有其他选择。

从技术上讲,相关实体的更新是在插件的子管道中执行的。在CRM 4.0中,我们只能在子管道中为CreateUpdateDelete消息注册插件步骤。在 CRM 2011 中,事件模型被"简化",并且由于该版本,不再可能指定管道。相反,在CreateUpdateDelete消息的PreOperationPostOperation阶段注册的插件始终在子管道中注册。

此问题有两种解决方案。首先,我认为这就是我从一开始就应该如何做到这一点,即利用Filtering attributes。正如你在这里读到的,它是:

更改时会导致插件执行的实体属性列表。如果值为 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;
}

最新更新