我是编写 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;
}
}
}
}
我已经尝试过:
在预操作上注册,会导致无法获得后操作值(显然)。异步运行插件解决了问题(因为它在主操作之后创建了一个新的更新事件?),但如果可能的话,强烈希望同步它。
statecode
effectivefrom
和
effectiveto
字段时不会触发它。因此,在后操作阶段、以同步模式
注册步骤是安全的。
在其他场景中,当修改的字段实际上是过滤属性集合的一部分时,可以检查 IPluginExecutionContext.Depth
属性以确定是否遇到递归更新。