识别更新插件是由详细记录中的更改引起的

时间:2014-02-13 14:36:47

标签: plugins dynamics-crm-2011 dynamics-crm

我有一个注册步骤,注册如下:

  • 沙箱,数据库
  • 更新消息
  • 引用实体
  • 后期操作(第40阶段)
  • 同步执行,仅限在线

主要方法是

public void Execute()
{
    throw new ArgumentException("DEBUG HALT");
}

该插件的目标是更改引发起源的Opportunity中的字段(我将检索它,更改字段并更新它)。

保存报价(OnSave事件)时,我已经有一些处理报价详情的脚本:

  • 删除所有报价详情(通过OData)
  • 从外部来源阅读报价详细信息数据
  • 重新创建报价详情(通过OData)

(涉及报价详情的整个过程我认为无关紧要,无论如何都很完美)

现在,当我点击Quote上的“保存”时,插件会被多次,而不是一次。我看到我的OData步骤失败并显示此插件的异常消息...

我检查了ParentContext以查看发生了什么,我看到了

PrimaryEntityName = "quote"
MessageName = "Retrieve" 

我希望与quotedetail实体有关?我绝对不希望每个引用操作多次执行该步骤:此步骤也将在其他消息上注册(Create,Delete,Close,SetState),我非常希望它能够重复一遍:是我追求的合理吗?我如何区分插件的触发方式/原因?

1 个答案:

答案 0 :(得分:0)

您可以查看一些内容来检查插件上下文以确定发生了什么。在您的情况下,如果您要针对不同的实体注册插件,则需要检查Context.PrimaryEntityNameContext.MessageNameContext.Depth以确定这是否是您的消息感兴趣。PrimaryEntityNameMessageName是自我解释的。 Context.Depth会告诉您how many plugins have fired that caused this plugin to fire

Be careful when using depth:

  

使用Depth属性时必须小心,因为还有更多   您可能遇到的复杂场景。例如,数据导入   可以触发工作流程来更新成员的“全名”,其中包含   转将执行我们的插件。在这种情况下,深度将是3   首次执行插件。如果您将代码段保留在上方   没有改变,插件逻辑永远不会被执行。

And another link here

只要您了解所有相互触发的插件,插件参数可能是更好的选择。