我是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.
答案 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字段键并更新你需要的东西。