3

在尝试合并 Microsoft CRM 中的联系人时,我使用以下代码 -

//c1ID and c2ID are GUIDs of duplicated contacts.

EntityReference target = new EntityReference();
target.LogicalName = Contact.EntityLogicalName;

target.Id = c2ID;

MergeRequest merge = new MergeRequest();
// SubordinateId is the GUID of the account merging.

merge.SubordinateId = c1ID;
merge.Target = target;
merge.PerformParentingChecks = true;

Contact updater = new Contact();
Contact updater2 = new Contact();

updater = (Contact)xrmSvc.ContactSet.Where(c => c.ContactId.Equals(c1ID)).First();
updater2 = (Contact)xrmSvc.ContactSet.Where(c => c.ContactId.Equals(c2ID)).First();

MergeResponse mergedR = (MergeResponse)xrmSvc.Execute(merge);

当我在这里尝试执行调用时,出现此错误-

无法在列集中为检索指定子属性。属性:所有者名称。

我没有正确设置一些东西吗?

4

3 回答 3

5

拥有updatecontent并不能改变问题。事实上,我在输入到updatecontent. 我发现您必须构建新的实体引用:

    if (match.Contains("new_mostrecentcampaign")) 
    master["new_mostrecentcampaign"] = 
        new EntityReference(match.GetAttributeValue<EntityReference>("new_mostrecentcampaign").LogicalName
                          , match.GetAttributeValue<EntityReference>("new_mostrecentcampaign").Id);
...
   Merge.UpdateContent = master
...
于 2013-09-10T14:33:53.087 回答
3

我意识到这是一个相当古老的问题,但对于那些在 2021 年及以后遇到同样问题的人来说,这就是发生此错误的原因。

TL;DR:确保属性的EntityReference值不指定Name属性。

解释:

添加到实体集的所有内容都UpdateContent将应用于Target联系人。MergeRequest在插件/工作流程中以编程方式执行 a 时,将UpdateContent应用 get 的属性(根据需要)。

这分解的地方是EntityReference值类型(查找)。执行此操作的内部 Microsoft 代码尝试解释EntityReference对象的所有属性,包括Name.

因此,当使用(动态获取最新版本)从SubordinateId联系人中提取现有值时,会自动为这些查找属性(子记录)设置属性。此操作无效,即使它不是直接执行它的用户代码。IOrganizationService.RetrieveName

这给我们带来了完整的循环来解释原始错误:

无法在列集中为检索指定子属性

于 2021-02-17T18:34:46.907 回答
1

我希望我对此有一些文档,但是尽管官方文档指出这UpdateContent是可选的,但经验证明它实际上是必要的。在MergeRequest我测试过的 s 中,我总是在请求中包含该属性,并且在 Dynamics 3.0的 MSDN 论坛中有一个帖子建议相同。

事实上,当我尝试在没有 UpdateContent分配的情况下合并组织中的两个联系人时,我实际上得到FaultException以下说法:

缺少必填字段“UpdateContent”

即使文档说它是可选的!

所以我建议UpdateContent用下面的内容填充属性,看看是否有效:

var merge = new MergeRequest
{
    // SubordinateId is the GUID of the account merging.

    SubordinateId = c1ID,
    Target = target,
    PerformParentingChecks = true,
    UpdateContent = new Contact()
};
于 2012-10-16T18:03:22.827 回答