我开发了一个在创建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
}
任何建议表示赞赏。非常感谢。
答案 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
}