【问题标题】:Edit a CRM Entity upon entity creation. CRM Dynamics Plugins在创建实体时编辑 CRM 实体。 CRM 动态插件
【发布时间】:2019-05-13 20:59:38
【问题描述】:

我有一个 CRM 自定义插件(通过 CRM 插件注册工具)在 Create Job 事件中注册。 “创建”是消息,“工作”是主要实体。

在创建新工作时,我想获取该实体并自动为其分配一个项目编号。我总是将“事件管道执行阶段”设置为操作后。我尝试了两种执行模式(异步和同步)。

异步总是按照"Entity job with ID '' does not exist" 的方式向我抛出错误

Synchronous 永远不会引发错误,但我的工具中没有任何代码正在执行。

    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。

【问题讨论】:

    标签: c# dynamics-crm dynamics-crm-2016


    【解决方案1】:

    对于自动编号插件,最佳做法是在 Pre-Operation (Synchronous) 上注册。这样,自动编号的字段将在创建记录的同一数据库事务中设置(避免不必要的事务和混乱的审计历史)。

    在编写预操作插件时,您不应该调用 service.Update(),而只需在目标上设置值(就像您现在一样),它们将与目标的其他属性一起被持久化。注释掉你的 service.Update() 行,你的插件应该可以在预操作中工作。

    异步总是向我抛出一个错误,类似于“ID 为 '' 的实体作业不存在

    Synchronous 永远不会抛出错误,但我的工具中没有任何代码正在执行

    发生这种情况是因为在创建过程中没有为记录分配 ID,直到它们被持久化到数据库中。您正在获取目标(没有 ID),然后尝试执行 service.Update() ,它需要一个具有 ID 的实体。同步和异步调用都会抛出错误,但异步错误发生在后台,你看不到。

    【讨论】:

    • 感谢@Zach,这是正确的并解决了我的问题。很好的解释。
    【解决方案2】:

    您必须在 PRT 中重新检查异步步骤注册。

    当您在发布消息管道中访问刚刚创建的记录 ID 时,同步插件将失败,因为数据库事务尚未提交。

    但异步插件将成功,因为数据库事务已提交并且可以访问 Id 记录。

    无论如何,最佳实践是在预操作本身中设置所需的属性值,以避免另一个显式更新服务调用。您可以在 SO 本身、Dynamics 社区和互联网博客中找到许多类似的 accepted answers 并提供相同的建议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多