2

我是 CRM 开发的新手。我有一个自定义实体“客户”。该实体有一个名为“defaultcustomer”的字段,可以是 TRUE 或 FALSE。我正在开发一个插件,我需要将所有“客户”的“defaultcustomer”设置为 FALSE。我这样做如下:

事实:

我已经为实体“客户”本身注册了插件。因此,当实体“客户”更新时,插件会触发。

private void MakeAllNonDefault()
{

    try
    {
        QueryExpression query = new QueryExpression("customer");
        query.ColumnSet = new ColumnSet("defaultcustomer");

        EntityCollection retrieved = service.RetrieveMultiple(query);

        foreach (Entity myCustomer in retrieved.Entities)
        {

            myCustomer["defaultcustomer"] = false;
            service.Update(myCustomer);
        }

    }
    catch (Exception ex)
    {
        throw new InvalidPluginExecutionException("An error occurred in MakeAllNonDefault(): " + ex.ToString());
    }
}

错误: 它在此行引发错误:

myCustomer["defaultcustomer"] = false;

System.Collections.Generic.KeyNotFoundException: 
The given key was not present in the dictionary. 
4

4 回答 4

7

该错误意味着属性集合中不存在特定字段。在 CRM 中,仅包含已设置或更新的属性。

尝试类似:

foreach (Entity myCustomer in retrieved.Entities)
{
    if (myCustomer.Attributes.ContainsKey("defaultcustomer"))
    {
        myCustomer["defaultcustomer"] = false;
    }
    else
    {
        myCustomer.Attributes.Add("defaultcustomer", false);
    }
    service.Update(myCustomer);
}
于 2012-03-28T07:57:24.260 回答
1

您是否仔细检查过该字段是否真的被称为 defaultcustomer?

如果它是自定义实体,则该字段可能以前缀开头,例如 new_defaultcustomer。确保您使用的是字段名称,而不是显示名称。

于 2012-03-29T10:50:48.103 回答
0

@glosrob 发布的解决方案似乎很好。您是否仍然收到“字典中不存在给定的键”?

尝试使用 ITracingService 获取有关插件执行流程的更多信息。

于 2012-03-29T10:36:54.520 回答
0

虽然更新所有 Crm 字段均为 False,但接受您更新该字段的内容。为此,您可以在插件中使用前置/后置图像。您将找到 crm 字段键并更新您需要的内容。

于 2014-08-04T13:57:17.750 回答