[英]Edit a CRM Entity upon entity creation. CRM Dynamics Plugins
我有一个CRM自定义插件,在活动创建作业上注册(通过CRM插件注册工具)。 “创建”是主要实体的消息和“工作”。
创建新作业后,我想获取该实体并自动为其分配项目编号。 我总是将'事件管道执行阶段'设置为后操作。 我尝试了两种执行模式(异步和同步)。
异步总是抛出一个错误, "Entity job with ID '' does not exist"
同步永远不会抛出错误,但我的工具中没有任何代码正在执行。
public void Execute(IServiceProvider serviceProvider)
{
var factory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
var orgService = factory.CreateOrganizationService(null);
var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
Entity ent = (Entity)context.InputParameters["Target"];
IOrganizationService service = factory.CreateOrganizationService(null);
if (ent.LogicalName == "cmc_job")
{
try
{
ent["cmc_jobnumber"] = "0000001";
ent["cmc_name"] += " - DEMO";
service.Update(ent);
}
catch (Exception e)
{
Console.Write(e.Message);
}
}
我也尝试过service.Create(entity)
,但我也倾向于遇到错误。 这些错误通常与重复记录有关。 此外,我确保停用与创建作业相关的任何现有流程。
如何在创建实体后立即正确更新实体字段? 哪种做法最好?
旁注 :我决定使用CRM自定义插件而不是自定义进程的原因是因为我需要查询最大的现有项目编号,然后再添加1。
对于自动编号插件,最佳做法是在预操作(同步)上注册。 这样,自动编号字段将在创建记录的同一数据库事务中设置(避免不必要的事务和杂乱的审计历史记录)。
在编写预操作插件时,不应该调用service.Update(),而只需在目标上设置值(就像当前一样),它们将与目标的其他属性一起保留。 注释掉你的service.Update()行和你的插件应该在pre-operation上工作。
异步总是抛出一个错误,就像“具有ID的实体作业”不存在一样
同步永远不会抛出错误,但我的工具中没有任何代码正在执行
发生这种情况是因为在创建期间,ID不会分配给记录,直到它们持久保存到数据库。 您正在获取Target(没有ID),然后尝试执行service.Update(),该服务需要具有ID的实体。 同步和异步调用都会引发错误,但异步错误会在后台发生,而您却看不到它。
您必须在PRT中重新检查异步步骤注册。
每当您在发布消息管道中访问刚创建的记录ID时,同步插件将失败,因为尚未提交数据库事务。
但异步插件将成功,因为提交数据库事务并且可以访问Id的记录。
无论如何,最佳实践是在预操作本身中设置所需的属性值,以避免另一个显式更新服务调用。 您可以在SO本身中找到许多类似的已接受答案 ,也可以在Dynamics社区和互联网博客中找到相同的建议。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.