无法在Retrieve的列集中指定子属性

时间:2012-10-16 16:26:28

标签: dynamics-crm dynamics-crm-2011

在尝试合并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);

当我在这里尝试我的执行调用时,我收到此错误 -

  

无法在Retrieve的列集中指定子属性。属性:owneridname。

我没有正确设置?

3 个答案:

答案 0 :(得分:4)

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
...

答案 1 :(得分:2)

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

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

说明:

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

这里的问题在于 EntityReference 值类型(查找)。执行此操作的 Microsoft 内部代码尝试解释 EntityReference 对象的所有属性,包括 Name

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

这让我们完整地解释了最初的错误:

<块引用>

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

答案 2 :(得分:1)

我希望我有一些相关的文档,但official documentation注意到UpdateContent是可选的,但经验证明它实际上是必要的。在我测试的MergeRequest中,我总是在请求中包含该属性,并且Dynamics 3.0的a post in the MSDN forums表示相同。

事实上,当我尝试在未分配 UpdateContent的情况下合并我的org 中的两个联系人时,我实际上得到了FaultException以下内容:

  

缺少必填字段“UpdateContent”

即使文档说它是可选的!

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

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

    SubordinateId = c1ID,
    Target = target,
    PerformParentingChecks = true,
    UpdateContent = new Contact()
};