我构建了一个在帐户更新消息中运行的插件,该插件进行了一些验证以不重复记录。但是,如果我尝试禁用该帐户或与另一个帐户合并,则会触发该插件。
如何判断插件是由激活/停用/合并操作触发,还是由 CRM Dynamics 2011 Save Event Arguments Reference中的事件模式触发?
我构建了一个在帐户更新消息中运行的插件,该插件进行了一些验证以不重复记录。但是,如果我尝试禁用该帐户或与另一个帐户合并,则会触发该插件。
如何判断插件是由激活/停用/合并操作触发,还是由 CRM Dynamics 2011 Save Event Arguments Reference中的事件模式触发?
要添加到 Pete Oakey 的答案,您实际上可以通过更改插件步骤的“过滤属性”来告诉您的插件仅在注册阶段更改某些字段时触发,此外还可以在实际代码@运行时对此进行测试。因此,除非您的验证逻辑特别需要StateCode
/StatusCode
属性来正确处理,否则您可以过滤掉这两个属性,或者只包含您的验证逻辑所需的属性。
原答案:
我相信你可以参考对象IExecutionContext.Depth Property
的。IPluginExecutionContext
每当一个正在运行的插件或工作流向 Web 服务发出一个触发另一个插件或工作流执行的消息请求时,执行上下文的深度属性就会增加。如果深度属性在配置的时间限制内增加到其最大值,则平台将此行为视为无限循环,并中止进一步的插件或工作流执行。最大深度 (8) 和时间限制(一小时)可由 Microsoft Dynamics CRM 管理员配置。
因此,您可以使用 if 语句来检查 if Depth > 1
。
一种方法是比较插件中帐户实体上更改的前后值。例如,如果您在值中只有active
(如果这是正确的属性名称) - 您可以查看 after 值以了解发生了什么。
另一种方法是为这些消息添加一个特定的插件并设置一些属性/标志,您可以在更新插件中检查它们。显然,这必须在更新插件之前运行。