我正在使用 crm 2016,我需要使用插件克隆记录,谷歌搜索后我发现我需要使用
Microsoft.Xrm.Client
来保存 clone()
功能 - 由于 MS 重组,该功能不在 2016 SDK 中。该库位于 2015 SDK 中。Clone()
中的方法Microsoft.Xrm.Client
仅在内存中创建Entity
对象的副本。它不会在 CRM 数据库中创建副本。当您需要在数据库中创建副本时,只需实例化一个新的 Entity
对象并将其传递给 Create()
接口的 IOrganizationService
方法即可。
当您确实需要如 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 (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 输入参数,检索父记录数据+所需的相关实体并在操作中手动创建(克隆)子记录+相关实体记录。
您可以从客户端/服务器端执行/调用此操作,无论您想要在哪里。
虽然 CRM 不提供开箱即用的简单克隆功能,但您可以查看这个漂亮的解决方案。 Inogic 将其称为“Click2Clone”。 以下是有关它如何让您的生活更轻松的独家新闻:
进行设置:首先下载 Click2Clone 并在 Dynamics CRM 中