如何在 Dynamics crm 2016 中克隆记录(服务器端)?
How to clone a record (server side) in Dynamics crm 2016?
我正在使用 crm 2016 并且我需要使用插件克隆记录,谷歌搜索后我发现我需要使用 Microsoft.Xrm.Client
来保存 clone()
函数 - 不在 2016 SDK 中,因为 MS reorganization.This lib 在 2015 SDK 中。
我的问题是:
1. 如果我从 CRM 2015 中获取该库并在 2016 年使用它,是否会支持它?
2. 如果不支持,我在服务器端克隆记录的选项是什么?
Microsoft 公告说:
We also removed Microsoft.Xrm.Client from the CRM 2016 (8.x) SDK client because it was not compliant with the OAuth changes, and replaced it with Microsoft.Xrm.Tooling.Connector. You can use the current Microsoft Dynamics 365 Software Development Kit (SDK) to access Microsoft Dynamics CRM back to version 6.x for both auth and messaging.
Dynamics 365 SDK Backwards Compatibility
您仍然可以在旧版 SDK 的项目中使用 Microsoft.Xrm.Client.dll,这可能会支持一段时间。
但我建议使用自定义 Action,将父记录作为 EntityReference 输入参数,检索父记录数据 + 需要的相关实体并在 Action 中手动创建(克隆)子记录 + 相关实体记录。
你可以 Execute/invoke 这个 从 client/server 边,任何你想要的地方。
Microsoft.Xrm.Client
中的方法Clone()
只在内存中创建了Entity
对象的副本。它不会在 CRM 的数据库中创建副本。当您需要在数据库中创建副本时,只需实例化一个新的 Entity
对象并将其传递给 IOrganizationService
接口的 Create()
方法。
当您确实需要 MSDN 中描述的深度克隆时,您可以考虑自己编写一个。在大多数情况下,您只需要复制属性集合中的对象。在这些对象中,只有引用类型 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;
}
请注意,这不会执行保存以在 CRM 数据库中创建克隆实体,这取决于您。
我正在使用 crm 2016 并且我需要使用插件克隆记录,谷歌搜索后我发现我需要使用 Microsoft.Xrm.Client
来保存 clone()
函数 - 不在 2016 SDK 中,因为 MS reorganization.This lib 在 2015 SDK 中。
我的问题是:
1. 如果我从 CRM 2015 中获取该库并在 2016 年使用它,是否会支持它?
2. 如果不支持,我在服务器端克隆记录的选项是什么?
Microsoft 公告说:
We also removed Microsoft.Xrm.Client from the CRM 2016 (8.x) SDK client because it was not compliant with the OAuth changes, and replaced it with Microsoft.Xrm.Tooling.Connector. You can use the current Microsoft Dynamics 365 Software Development Kit (SDK) to access Microsoft Dynamics CRM back to version 6.x for both auth and messaging.
Dynamics 365 SDK Backwards Compatibility
您仍然可以在旧版 SDK 的项目中使用 Microsoft.Xrm.Client.dll,这可能会支持一段时间。
但我建议使用自定义 Action,将父记录作为 EntityReference 输入参数,检索父记录数据 + 需要的相关实体并在 Action 中手动创建(克隆)子记录 + 相关实体记录。
你可以 Execute/invoke 这个
Microsoft.Xrm.Client
中的方法Clone()
只在内存中创建了Entity
对象的副本。它不会在 CRM 的数据库中创建副本。当您需要在数据库中创建副本时,只需实例化一个新的 Entity
对象并将其传递给 IOrganizationService
接口的 Create()
方法。
当您确实需要 MSDN 中描述的深度克隆时,您可以考虑自己编写一个。在大多数情况下,您只需要复制属性集合中的对象。在这些对象中,只有引用类型 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;
}
请注意,这不会执行保存以在 CRM 数据库中创建克隆实体,这取决于您。