当操作后创建跟随操作前更新插件时,CRM 2013执行顺序
本文关键字:操作 CRM 2013 执行 顺序 更新 创建 跟随 插件 | 更新日期: 2023-09-27 18:20:39
我有一个插件,它是在Incident实体的操作前更新中启动的。过滤后的属性为new_ScureIncident。
作为插件执行的一部分,我在另一个名为Secure Access的实体中创建了一个新记录(该实体有一个Look up to Incident实体)。
此外,作为此预操作的一部分,我更新了Incident实体上的特定字段new_DocumentSetURL。
这就是我设置的方式。
Incident incidentBeforeUpdate = (context.PreEntityImages != null && context.PreEntityImages.Contains(this.PreImageAlias)) ? context.PreEntityImages[this.PreImageAlias].ToEntity<Incident>() : null;
Incident incident = (context.InputParameters != null && context.InputParameters.Contains(Target) && context.InputParameters[Target] is Entity) ? ((Entity)context.InputParameters[Target]).ToEntity<Incident>() : null;
我稍后更新new_DocumentSetURL的值,如下所示
incident.new_DocumentSetURL = incidentDocumentURL;
现在,我在安全访问实体上也有一个操作后创建插件。
问题:
安全访问上的插件仍然具有new_DocumentSetURL的旧值。我如何组织我的插件,以便在Secure Access实体上创建插件获得正确的DocumentSetURL值?
完整流程描述
事件预更新会将Web服务调用到SharePoint。此WCF web服务调用将DocumentSetURL值作为输入参数,并返回一个修改后的值。我使用修改后的DocumentSetURL更新偶发事件。
然后,我创建了一个新的安全访问记录。这再次调用WCF web服务,并使用两个参数,DocumentSetURL(在安全访问上查找的)和安全访问的名称(主属性)。
请注意,安全访问记录也可以手动创建。因此,我只是调用service.Create(new_secureaccess)
,而不是在Incident的PreUpdate中编写安全访问的PostCreate功能。
这样,我只需要写一次安全访问的PostCreate,无论它是手动创建的还是自动创建的(通过事件预更新插件),它都会被调用。
听起来问题可能出在操作顺序上。
您正在事件的PreOp阶段创建安全访问记录,因此您为incident.new_DocumentSetURL
设置的值尚未提交到数据库;因此,您尝试从新创建的安全访问记录的链接事件中检索此属性时,只"知道"旧记录。
相反,将创建安全访问记录的逻辑移动到事件的PostOp。这将在您对incident.new_DocumentSetURL
的更改保存到数据库后。
如果需要,您可以将Incident的PreOp中的整个逻辑移到PostOp中(因此所有逻辑都将在一个位置),但由于处理阶段的原因,这需要在设置值后调用service.Update(incident)
。如果你走这条路,请确保在创建安全访问记录之前更新事件(这样操作顺序就不会起作用)。