CRM 4 到 2016 迁移,插件事件
CRM 4 to 2016 migration, Plugin events
我正在将 CRM 4 迁移到 2016,我需要澄清一些关于插件执行的事情。在两个 CRM 版本中,我们都有帐户和报价实体。引用的帐户与父母关系有关 1:N。在 CRM 4 中,当您首先将帐户分配给不同的所有者时 Assign
和下一个 Update
消息被触发,但仅限于帐户实体。
在 CRM 2016 中,我观察到 Update
(仅更新 - 不分配)消息也会在引用(以及其他 child 实体,如果关系设置为父母)上被触发。此外,如果引用有 child 个与亲子关系相关的实体,则 Update
消息会在此 child 个实体上触发,依此类推。有没有办法在插件中识别这种情况(级联更新)?
应该有一个引用事件源的父上下文。可以遍历IPluginExecutionContext.ParentContext
属性回根,找出触发器的来源。当你在那里找不到它时(例如当同步和异步操作混合时),恐怕没有其他选择。
从技术上讲,相关实体的更新是在插件的子管道中执行的。在 CRM 4.0 中,我们只能在 Create
、Update
和 Delete
消息的子管道中注册插件步骤。在 CRM 2011 中,事件模型是 'simplified',从那个版本开始,不再可能指定管道。相反,在 PreOperation
和 PostOperation
阶段为 Create
、Update
和 Delete
消息注册的插件始终在子管道中注册。
这个问题有两种解决方法。第一个,我认为这是我应该如何从一开始就利用 Filtering attributes
来做这件事。如您所见,here 是:
A list of entity attributes that, when changed, cause the plug-in to execute. A value of null causes the plug-in to execute if any of the attributes change.
其次是部分使用 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;
}
我正在将 CRM 4 迁移到 2016,我需要澄清一些关于插件执行的事情。在两个 CRM 版本中,我们都有帐户和报价实体。引用的帐户与父母关系有关 1:N。在 CRM 4 中,当您首先将帐户分配给不同的所有者时 Assign
和下一个 Update
消息被触发,但仅限于帐户实体。
在 CRM 2016 中,我观察到 Update
(仅更新 - 不分配)消息也会在引用(以及其他 child 实体,如果关系设置为父母)上被触发。此外,如果引用有 child 个与亲子关系相关的实体,则 Update
消息会在此 child 个实体上触发,依此类推。有没有办法在插件中识别这种情况(级联更新)?
应该有一个引用事件源的父上下文。可以遍历IPluginExecutionContext.ParentContext
属性回根,找出触发器的来源。当你在那里找不到它时(例如当同步和异步操作混合时),恐怕没有其他选择。
从技术上讲,相关实体的更新是在插件的子管道中执行的。在 CRM 4.0 中,我们只能在 Create
、Update
和 Delete
消息的子管道中注册插件步骤。在 CRM 2011 中,事件模型是 'simplified',从那个版本开始,不再可能指定管道。相反,在 PreOperation
和 PostOperation
阶段为 Create
、Update
和 Delete
消息注册的插件始终在子管道中注册。
这个问题有两种解决方法。第一个,我认为这是我应该如何从一开始就利用 Filtering attributes
来做这件事。如您所见,here 是:
A list of entity attributes that, when changed, cause the plug-in to execute. A value of null causes the plug-in to execute if any of the attributes change.
其次是部分使用 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;
}