代码之家  ›  专栏  ›  技术社区  ›  Damkulul

如何在Dynamics crm 2016中克隆记录(服务器端)?

  •  2
  • Damkulul  · 技术社区  · 6 年前

    我正在使用crm 2016 我需要使用插件克隆一条记录,在谷歌搜索后,我发现我需要使用 Microsoft.Xrm.Client 持有 clone() 函数-由于MS重组,该函数不在2016 SDK中。此库位于2015 SDK中。
    我的问题是:
    1、如果我将从CRM 2015中获取lib并在2016年使用,它是否会得到支持?
    2、如果不支持,我在服务器端克隆记录的选项是什么?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Henk van Boeijen    6 年前

    方法 Clone() Microsoft.Xrm.Client 仅创建 Entity 内存中的对象。它不会在CRM数据库中创建副本。当需要在数据库中创建副本时,只需实例化一个新的 实体 对象并将其传递给 Create() 的方法 IOrganizationService 界面

    当您确实需要如中所述的深度克隆时 MSDN 你可以考虑自己写一本。在大多数情况下,您只需要复制属性集合中的对象。在这些对象中,只有引用类型 EntityReference ,则, OptionSetValue Money 我需要你的特别关注。

    我不建议使用不推荐使用的库。

        2
  •  2
  •   Matt    6 年前

    我们使用以下帮助器方法克隆实体-这是原始实体的更新版本,可以正确克隆引用类型,并排除系统属性

    public static Entity CloneEntitySandbox(Entity entityToClone)
        {
            var newEntity = new Entity(entityToClone.LogicalName);
    
            var systemAttributes = new List<string>();
            systemAttributes.Add("createdon");
            systemAttributes.Add("createdby");
            systemAttributes.Add("modifiedon");
            systemAttributes.Add("modifiedby");
            systemAttributes.Add("owninguser");
            systemAttributes.Add("owningbusinessunit");
    
    
            foreach (var attribute in entityToClone.Attributes
                .Where(x => x.Key != entityToClone.LogicalName + "id")
                .Where(x => !systemAttributes.Contains(x.Key))) 
            {
    
                switch (attribute.Value.GetType().Name)
                {
                    case "Money":
                        var m = attribute.Value as Money;
                        newEntity[attribute.Key] = new Money(m.Value);
                        break;
                    case "EntityReference":
                        var er = attribute.Value as EntityReference;
                        newEntity[attribute.Key] = new EntityReference(er.LogicalName, er.Id);
                        break;
                    case "OptionSetValue":
                        var os = attribute.Value as OptionSetValue;
                        newEntity[attribute.Key] = new OptionSetValue(os.Value);
                        break;
                    default:
                        newEntity[attribute.Key] = attribute.Value;
                        break;
                }
    
            }
    
            return newEntity;
        }
    

    请注意,这不会执行保存以在CRM数据库中创建克隆实体,这取决于您。

        3
  •  1
  •   Arun Vinoth PrecogTechnologies    6 年前

    Microsoft发布内容如下:

    我们还删除了Microsoft。Xrm。CRM 2016(8.x)SDK客户端中的客户端,因为它不符合OAuth的更改,并将其替换为Microsoft。Xrm。工具。连接器。您可以使用当前的Microsoft Dynamics 365软件开发工具包(SDK)将Microsoft Dynamics CRM访问回版本6。x表示身份验证和消息传递。

    Dynamics 365 SDK Backwards Compatibility

    您仍然可以使用Microsoft。Xrm。客户您的项目中使用旧SDK中的dll,这可能会支持一段时间。

    但我建议使用自定义操作,将父记录作为EntityReference输入参数,检索父记录数据+所需的相关实体;手动创建(克隆)子记录+相关实体记录。

    您可以执行/调用此 Action 从客户机/服务器端,随时随地。