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

Dynamics crm 如何在Dynamics crm 2016中克隆记录(服务器端)?,dynamics-crm,dynamics-crm-2016,cloning,Dynamics Crm,Dynamics Crm 2016,Cloning,我正在使用crm2016,我需要使用插件克隆一条记录,在谷歌搜索后,我发现我需要使用Microsoft.Xrm.Client来保存clone()函数-由于MS重组,该函数不在2016 SDK中。该库在2015 SDK中。 我的问题是: 1.如果我从CRM 2015中获取该lib,并在2016年使用它,它会得到支持吗? 2.如果不支持,在服务器端克隆记录的选项有哪些?Microsoft公告说: 我们还从CRM 2016(8.x)SDK客户端中删除了Microsoft.Xrm.Client,因为它不

我正在使用crm2016,我需要使用插件克隆一条记录,在谷歌搜索后,我发现我需要使用
Microsoft.Xrm.Client
来保存
clone()
函数-由于MS重组,该函数不在2016 SDK中。该库在2015 SDK中。
我的问题是:
1.如果我从CRM 2015中获取该lib,并在2016年使用它,它会得到支持吗?

2.如果不支持,在服务器端克隆记录的选项有哪些?

Microsoft公告说:

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

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

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

您可以在任何地方从客户端/服务器端执行/调用此操作。

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

当你真的需要一个深克隆,你可以考虑自己写一个。在大多数情况下,您只需要复制属性集合中的对象。在这些对象中,只有引用类型
EntityReference
OptionSetValue
Money
需要特别注意


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

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

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;
    }
公共静态实体CloneEntitySandbox(实体entityToClone)
{
var newEntity=新实体(entityToClone.LogicalName);
var属性=新列表();
添加(“createdon”);
系统化贡品。添加(“createdby”);
系统化贡品。添加(“修改件”);
补充说明。添加(“修改人”);
系统化贡品。添加(“所有者”);
添加(“拥有业务单位”);
foreach(entityToClone.Attributes中的var属性
.Where(x=>x.Key!=entityToClone.LogicalName+“id”)
.Where(x=>!systemAttributes.Contains(x.Key)))
{
开关(attribute.Value.GetType().Name)
{
“金钱”一案:
var m=属性。作为货币的价值;
newEntity[attribute.Key]=新货币(m.Value);
打破
案例“实体参考”:
var er=作为EntityReference的attribute.Value;
newEntity[attribute.Key]=newentityreference(er.LogicalName,er.Id);
打破
案例“OptionSetValue”:
var os=属性。值作为选项SetValue;
newEntity[attribute.Key]=新选项设置值(os.Value);
打破
违约:
newEntity[attribute.Key]=attribute.Value;
打破
}
}
返回新实体;
}

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

在您的示例中,引用类型
EntityReference
OptionSetValue
Money
不会被克隆。只有对这些对象的引用才会被复制。@HenkvanBoeijen不可否认,是的,作为引用类型的字段最终指向原始实体上的值-但是,当克隆实体保存到数据库时,您最终会得到原始实体的一个新副本,正如预期的那样,当克隆实体保存到数据库两次时,您会得到原始实体的两个新副本,哈哈!