Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dynamics crm CRM 4至2016迁移、插件事件_Dynamics Crm_Dynamics Crm 4_Dynamics Crm 2016 - Fatal编程技术网

Dynamics crm CRM 4至2016迁移、插件事件

Dynamics crm CRM 4至2016迁移、插件事件,dynamics-crm,dynamics-crm-4,dynamics-crm-2016,Dynamics Crm,Dynamics Crm 4,Dynamics Crm 2016,我正在将CRM 4迁移到2016年,我需要澄清一些关于插件执行的问题。在两个CRM版本中,我们都有账户和报价实体。要报价的帐户与家长关系1:N相连接。在CRM 4中,当您首先将帐户分配给不同的所有者时,会触发下一个更新消息,但仅针对帐户实体 在CRM 2016中,我观察到,Update(仅更新-不分配)消息也会在quote上触发(如果关系设置为parental,则会触发其他子实体)。此外,如果quote具有与父关系连接的子实体,则会对该子实体触发更新消息,依此类推。有没有办法识别插件内部的这种情

我正在将CRM 4迁移到2016年,我需要澄清一些关于插件执行的问题。在两个CRM版本中,我们都有账户和报价实体。要报价的帐户与家长关系1:N相连接。在CRM 4中,当您首先将帐户分配给不同的所有者时,会触发下一个
更新
消息,但仅针对帐户实体


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

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


从技术上讲,相关实体的更新是在插件的子管道中执行的。在CRM 4.0中,我们只能在子管道中注册
创建
更新
删除
消息的插件步骤。在CRM 2011中,事件模型被“简化”,并且由于该版本,因此无法再指定管道。相反,在
创建
更新
删除
消息的
操作前
操作后
阶段注册的插件始终注册在子管道中。

有两种解决方案。首先,我认为我应该如何从一开始就使用
过滤属性
。正如你所看到的:

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

第二是部分使用亨克提到的
ParentContext
——感谢你为我指明了正确的方向!您必须按照下面的方法进行检查。如果有人想使用这种方法,请记住首先测试它。它适用于my case和my plugins,但您的插件可能在不同的步骤、消息和实体上注册,并且此方法可能不适用于您

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

这只是一个简单的想法,但是如果您通常不手动分配子实体,那么当目标包含ownerid属性时,您可以检测到级联更新。选中它。在这两种情况下,ownerid都存在。您是否检查了此意外的CRM 2016更新消息中发送的属性?是的,我比较了这两种情况下发送的属性,没有任何差异。该死……在此级联更新中,即使上下文深度也设置为1