CRM插件错误字典中没有给定的密钥

时间:2014-08-02 00:42:30

标签: c# plugins crm

我开发了一个在创建Case实体时触发的CRM插件。 Case与另一个自定义实体具有N:1关系。短篇小说,当一个字段" new_CaseAssign"从自定义实体设置为1,然后插件将生成分配给案例所有者的任务。

然而问题是该字段" new_CaseAssign"是新添加的,因此大多数自定义实体记录尚未设置此字段,这会导致插件错误输出"字典中没有给定的密钥"。如果自定义字段具有值,那么它没有问题。

处理这种情况的最佳方法是什么?我尝试了customEntity.Attributes.Contains(" new_CaseAssign"),如下面的代码,但没有成功:

var new_CaseAssign = customEntity.Attributes["new_CaseAssign"];

if ((customEntity.Attributes.Contains("new_CaseAssign")) && (bool)new_CaseAssign)
        {
            activityEntity.Attributes.Add("ownerid", incident.Attributes["ownerid"]);
        }
        else 
        { //something else
        }

任何建议表示赞赏。非常感谢。

2 个答案:

答案 0 :(得分:2)

该行:

var new_CaseAssign = customEntity.Attributes["new_CaseAssign"];

可能导致异常。您可以将代码重写为:

bool new_CaseAssign = false;
if (customEntity.Attributes.Contains("new_CaseAssign"))
    new_CaseAssign = (bool) customEntity.Attributes["new_CaseAssign"];

if (new_CaseAssign) {
    activityEntity.Attributes.Add("ownerid", incident.Attributes["ownerid"]);
}
else { //something else
}

因此,在尝试访问密钥之前首先检查包含。

答案 1 :(得分:1)

厌恶的答案部分正确,实际上您在检查前是否存在该属性是否存在。通常我也会在演员表之前检查属性是否为空。

第二个错误是使用字段名称,您使用的是后期绑定样式,这意味着您需要使用逻辑名称而不是模式名称,因此字段名称为new_caseassign(全部小写)而不是new_CaseAssign

if ((customEntity.Attributes.Contains("new_caseassign")) && customEntity.Attributes["new_caseassign"] != null)
{
    if ((bool)customEntity.Attributes["new_caseassign"])
    {
        activityEntity.Attributes.Add("ownerid", incident.Attributes["ownerid"]);
    }
}
else 
{ //something else
}