是否有可能有一个同步后操作插件,可以在不递归的情况下更新触发实体上的字段?

问题描述 投票:0回答:1

我是编写 D365CE 插件的初学者,并且对同步运行、后操作和创建递归的插件有疑问。

据我了解,下面的代码中使用了 IOrganizationService 更新,导致在更新事件期间运行时出现递归。但是是否可以创建一个插件,它能够“同步”运行并从记录中获取“后操作值”并更新同一记录上的另一个字段,而不会导致递归?我已经考虑过检查 context.depth 但由于可能存在数据不一致,似乎不建议这样做。 插件注册工具信息: 消息:更新

主要实体:
引用 过滤属性:
statecode 管道:
操作后 执行模式:
同步
示例代码: public class Quote_SetEffectiveDates : IPlugin { public void Execute(IServiceProvider serviceProvider) { ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService)); IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext)); if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity) { IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory)); IOrganizationService service = serviceFactory.CreateOrganizationService(null); try { if (context.PrimaryEntityId != null) { ColumnSet quote_Col = new ColumnSet("statecode"); Entity quote = service.Retrieve("quote", context.PrimaryEntityId, quote_Col); int statecode = quote.GetAttributeValue<OptionSetValue>("statecode").Value; if (statecode == 1) { DateTime currentDate = DateTime.UtcNow.Date; Entity quote_Update = new Entity { LogicalName = quote.LogicalName, Id = quote.Id, }; quote_Update["effectivefrom"] = currentDate; quote_Update["effectiveto"] = currentDate.AddDays(30); service.Update(quote_Update); } } } catch (FaultException<OrganizationServiceFault> ex) { throw new InvalidPluginExecutionException("An error occured in Quote_SetEffectiveDates plugin", ex); } catch (Exception ex) { tracingService.Trace("Quote_SetEffectiveDates; {0}", ex.ToString()); throw; } } } }

我已经尝试过:

在预操作上注册,会导致无法获得后操作值(显然)。

异步运行插件解决了问题(因为它在主操作之后创建了一个新的更新事件?),但如果可能的话,强烈希望同步它。
  1. 由于过滤属性是
statecode
plugins dynamics-crm dataverse dynamics-365-ce
1个回答
0
投票
effectivefrom

effectiveto
字段时不会触发它。
因此,在
后操作阶段
、以

同步模式

注册步骤是安全的。 在其他场景中,当修改的字段实际上是过滤属性集合的一部分时,可以检查 IPluginExecutionContext.Depth 属性以确定是否遇到递归更新。


© www.soinside.com 2019 - 2024. All rights reserved.