Dynamics 365 CRM更新contact的Web Role时Assembly插件未触发
问题根因
Dynamics 365 中只有实体普通字段更新才会触发实体的Update消息,两个实体间N:N多对多关系的关联、解除关联操作,不会触发关联双方实体的Update事件,这就是更新contact普通字段时插件正常运行、增删Web Role关联时插件不触发的核心原因。N:N关系的操作走的是独立的Associate(新增关联)和Disassociate(移除关联)消息,你之前仅给contact的Update消息注册了插件步骤,自然捕获不到关联变更的场景。
具体配置调整步骤
- 第一步:新增两个插件步骤绑定N:N关系操作消息
打开插件注册工具,找到你已经注册好的插件程序集,新增两个步骤,配置和你现有contact Update步骤的执行模式(同步/异步)、执行阶段、执行用户保持一致即可,两个步骤的消息配置如下:- 消息选择
Associate:主实体不要选contact,直接选你配置的contact与Web Role之间的N:N关系(在实体列表里找关系架构名,一般格式为[发布者前缀]_contact_[webrole实体架构名]),这个步骤会在给联系人新增Web Role关联时触发 - 消息选择
Disassociate:同样绑定上述同一个N:N关系,这个步骤会在移除联系人关联的Web Role时触发
- 消息选择
- 第二步:调整插件代码的上下文判断逻辑,兼容三类触发场景
你现有插件默认只处理Update消息的上下文,需要补充对Associate、Disassociate消息的参数解析:- 首先获取当前插件执行上下文的消息名称,如果是
Associate或Disassociate,先读取上下文的Relationship属性,校验Schema Name是不是你contact和Web Role的N:N关系名,过滤掉其他实体、其他关系的关联操作,避免无关场景误触发第三方API调用 - 从上下文的
PrimaryEntityId参数获取当前操作对应的contact记录ID,从RelatedEntities参数获取本次新增/移除的Web Role记录集合,把这两个参数传入你原有的第三方API调用逻辑即可,核心业务代码不需要改动
- 首先获取当前插件执行上下文的消息名称,如果是
- 可选优化:如果不想改动现有插件的逻辑分支,也可以单独注册两个轻量插件步骤绑定Associate、Disassociate消息,触发后直接复用你现有插件里处理contact变更的核心方法,逻辑完全隔离不影响原有功能。
注意:不要直接把Associate、Disassociate步骤绑定在contact主实体上不做关系校验,否则contact和其他所有实体的N:N关联操作(比如加营销列表、关联其他自定义实体记录)都会触发你的插件,会产生大量无效调用甚至业务错误。
内容的提问来源于stack exchange,提问作者Ranjit Katariya
相关产品推荐
相关产品推荐

