在实体创建时编辑 CRM 实体。 CRM 动态插件

Edit a CRM Entity upon entity creation. CRM Dynamics Plugins

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

创建新工作后,我想获取该实体并自动为其分配项目编号。我总是将 'Event Pipeline Stage of Execution' 设置为 Post-Operation。我已经尝试了两种执行模式(异步和同步)。

异步总是给我一个错误 "Entity job with ID '' does not exist"

同步从不抛出错误,但正在执行我工具中的 none 代码。

    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给它。

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

编写 pre-operation 插件时,您不应调用 service.Update(),而应简单地在目标上设置值(如您当前所设置的那样),它们将与其他目标一起持久化目标的属性。注释掉您的 service.Update() 行,您的插件应该可以在 pre-operation.

上运行

异步总是向我抛出“ID 为 '' 的实体作业不存在

的错误

同步从不抛出错误,但正在执行我工具中 none 的代码

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

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

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

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

无论如何,最佳做法是在 pre-operation 本身中设置所需的属性值,以避免再次调用显式更新服务。您可以在 SO 本身以及 Dynamics 社区和互联网博客中找到许多具有相同建议的类似