CRM 2011 KeyNotFoundException异常

时间:2012-03-28 05:15:38

标签: dynamics-crm-2011 keynotfoundexception query-expressions

我是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 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

@glosrob发布的解决方案似乎很好。你仍然得到“字典中没有给定的密钥”吗?

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

答案 3 :(得分:0)

更新所有Crm字段为False时接受更新字段的内容。为此,您可以使用插件中的前/后图像。你会发现crm字段键并更新你需要的东西。