【问题标题】:CRM 4 to 2016 migration, Plugin eventsCRM 4 到 2016 迁移,插件事件
【发布时间】:2017-01-20 12:22:23
【问题描述】:

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

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

【问题讨论】:

  • 只是一个简单粗暴的想法,但如果您通常不手动分配子实体,则可以在目标包含 ownerid 属性时检测级联更新。
  • 检查过了。在这两种情况下,ownerid 都存在。
  • 您是否检查了此意外的 CRM 2016 更新消息中发送了哪些属性?
  • 是的,我比较了这两种情况下发送的属性,没有区别。
  • 该死...在这个级联更新中,即使上下文中的深度设置为 1

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这个问题有两种解决方案。第一个,我认为这就是我应该如何从一开始就使用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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-14
      • 2018-09-08
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      相关资源
      最近更新 更多