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

Plugins 识别更新插件是由详细记录中的更改引起的,plugins,dynamics-crm-2011,dynamics-crm,Plugins,Dynamics Crm 2011,Dynamics Crm,我注册了一个插件步骤,如下所示: 沙箱、数据库 更新消息 报价实体 手术后(第40阶段) 同步执行,仅在线 主要方法很简单 public void Execute() { throw new ArgumentException("DEBUG HALT"); } 该插件的目标是更改Opportunity中的一个字段,该字段是引用的来源(我将检索它,更改该字段,然后更新它) 保存报价时(OnSaveevent),我已经有了一些处理报价详细信息的脚本: 删除所有报价详细信息(通过ODa

我注册了一个插件步骤,如下所示:

  • 沙箱、数据库
  • 更新消息
  • 报价实体
  • 手术后(第40阶段)
  • 同步执行,仅在线
主要方法很简单

public void Execute()
{
    throw new ArgumentException("DEBUG HALT");
}
该插件的目标是更改
Opportunity
中的一个字段,该字段是引用的来源(我将检索它,更改该字段,然后更新它)

保存报价时(
OnSave
event),我已经有了一些处理报价详细信息的脚本:

  • 删除所有报价详细信息(通过OData)
  • 从外部源读取报价详细信息数据
  • 重新创建报价详细信息(通过OData)
(我认为涉及报价细节的整个过程与此无关,无论如何它都能完美工作)

现在,当我点击报价单上的“保存”时,插件被触发了很多次,而不仅仅是一次。我看到我的OData步骤失败并显示此插件的异常消息

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

PrimaryEntityName = "quote"
MessageName = "Retrieve" 

我希望与
quotedetail
实体有关?我绝对不想在每个报价操作中执行该步骤不止一次:该步骤也将在其他消息(创建、删除、关闭、设置状态)上注册,我非常希望它不会重复:我所追求的是否合理?如何区分插件是如何/为什么启动的?

您可以查看一些内容来检查插件上下文,以确定发生了什么。在您的情况下,如果要针对不同的实体注册插件,您需要检查
上下文.PrimaryEntityName
上下文.MessageName
,和
上下文.Depth
,以确定这是否是您感兴趣的消息。
PrimaryEntityName
MessageName
是不言自明的。
Context.Depth
将告诉您

使用“深度”属性时必须小心,因为有更多 您可能会遇到的复杂场景。例如,数据导入 可能会触发工作流以更新成员的“全名”,在 turn将执行我们的插件。在这种情况下,底部的深度将为3 插件的第一次执行。如果您留下了上面的代码段 不变,插件逻辑将永远不会执行


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

不幸的是
Depth
始终为1(我有点期待这一点,只涉及一个插件步骤),我将更仔细地观察父上下文,希望有什么变化如果
深度
1
,那么就有什么东西执行了插件所说的发生的事情。
Context.PrimaryEntityName
Context.MessageName
将包含导致插件启动的触发器。这将通过Ui或SDK引起。