Dynamics crm CRM 4至2016迁移、插件事件
我正在将CRM 4迁移到2016年,我需要澄清一些关于插件执行的问题。在两个CRM版本中,我们都有账户和报价实体。要报价的帐户与家长关系1:N相连接。在CRM 4中,当您首先将帐户分配给不同的所有者时,会触发下一个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 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