'The given key was not present in the dictionary' - 但密钥存在
'The given key was not present in the dictionary' - but the key exists
我目前正在开发 MS Dynamics CRM 2013 - 插件。
当我尝试将字符串值分配给实体字段的键时,它给了我 'keynotfound'-exception。
这让我毫无头绪,因为我可以验证密钥是否存在。我给的key也写对了,数据类型也兼容
这里有一些额外的信息:
- 我尝试通过重新启动服务器来解决问题。没有。
- 远程调试不是一个选项。
- 我用 retrieved.EntityCollection.Entities[i]["new_name"] 交换了 "retrieved.EntityCollection.Entities[i][forField]",一切正常(这里有点明显,但 "new_name" 不是我尝试访问的密钥)。
- 执行停止@"if (retrieved.EntityCollection.Entities[i][forField].ToString() != "" && !overwriteExisting)"
你有什么想法可以帮助我吗?
public void GenerateNumberForEntityCollection(string target)
{
try
{
// variables for number generation
bool overwriteExisting = (bool)preImageEntity["new_overwriteexisting"];
int suffixstart = (int)preImageEntity["new_suffixstart"];
string forField= preImageEntity["new_forfield"].ToString();
string prefix = preImageEntity["new_prefix"].ToString();
string postfix = preImageEntity["new_postfix"].ToString();
string separator = preImageEntity["new_separator"].ToString();
// Build query to get all the entries
RetrieveMultipleResponse retrieved;
int PageNumber = 1;
string PagingCookie = string.Empty;
int PageSize = 5000;
string[] Columns = { forField };
QueryExpression query = new QueryExpression()
{
EntityName = target,
ColumnSet = new ColumnSet(Columns),
PageInfo = new PagingInfo()
{
PageNumber = 1,
Count = PageSize
}
};
do
{
if (PageNumber != 1)
{
query.PageInfo.PageNumber = PageNumber;
query.PageInfo.PagingCookie = PagingCookie;
}
RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();
retrieve.Query = query;
retrieved = (RetrieveMultipleResponse)service.Execute(retrieve);
// Now that all entities are retrieved, iterate through them to gen. the numbers
int i = 0;
foreach (Entity entity in retrieved.EntityCollection.Entities)
{
if (retrieved.EntityCollection.Entities[i][forField].ToString() != "" && !overwriteExisting)
{
//continue;
}
else
{
retrieved.EntityCollection.Entities[i][forField] = prefix + separator + suffixstart.ToString() + separator + postfix;
}
suffixstart++;
service.Update(retrieved.EntityCollection.Entities[i]);
i++;
}
if (retrieved.EntityCollection.MoreRecords)
{
PageNumber++;
PagingCookie = retrieved.EntityCollection.PagingCookie;
}
} while (retrieved.EntityCollection.MoreRecords);
}
catch (Exception e)
{
tracing.Trace("GenerateNumberForEntityCollection: Failed: {0}", e.ToString());
}
}
你是如何验证密钥存在的?
如果 字段中的数据为 null,实体实例 将不包含该键 ,即使您在查询的列集。
这将为您 return 一个布尔值,指示该键是否存在于实体中。您可以在尝试读取属性之前执行此控制。
var attributeExists = retrieved.EntityCollection.Entities[i].Contains(forField)
如果该字段为空,您所做的下面的控制将导致您得到的异常。只要确保该属性之前存在即可。
retrieved.EntityCollection.Entities[i][forField].ToString() != ""
此外,如果查询中没有记录 return,您将得到空引用异常。让你对 retrieved.EntityCollection.Entities.
进行空检查
当您在 Dynamics CRM 中查询数据时,请务必了解数据库中具有 null
值的记录字段不包含在 Entity
实例的 Attributes
集合中被退回。
使用此构造从 Entity
的 Attribute
获取值:
var value = retrieved.EntityCollection.Entities[i][forField].ToString();
当属性 forField
已在数据库中具有值时成功,但当其当前值为 null
.
时 失败
因此,从实体获取属性值的首选方法是 GetAttributeValue<T>
,如下所示:
var value = retrieved.EntityCollection.Entities[i].getAttributeValue<string>(forField);
此方法returns当属性存在于属性集合中时取值,否则returnsnull
.
If any of the fields among
(new_forfield,new_prefix,new_postfix,new_separator) has null value,
that column does not present in the retrieved object and you are trying to get the value of null column preImageEntity["new_forfield"] which will throw keynotfound'-exception ,
so change the code
string forField= preImageEntity["new_forfield"].ToString();
string prefix = preImageEntity["new_prefix"].ToString();
string postfix = preImageEntity["new_postfix"].ToString();
string separator = preImageEntity["new_separator"].ToString();
至
string forField = preImageEntity.Attributes.Contains("new_forfield")? preImageEntity["new_forfield"].ToString():"";
string prefix = preImageEntity.Attributes.Contains("new_forfield") ? preImageEntity["new_prefix"].ToString() : "";
string postfix = preImageEntity.Attributes.Contains("new_forfield") ? preImageEntity["new_postfix"].ToString() : "";
string separator = preImageEntity.Attributes.Contains("new_forfield") ? preImageEntity["new_separator"].ToString() : "";
this will check for field, if it exists than will parse the value to
string else will assign empty string.
我目前正在开发 MS Dynamics CRM 2013 - 插件。 当我尝试将字符串值分配给实体字段的键时,它给了我 'keynotfound'-exception。
这让我毫无头绪,因为我可以验证密钥是否存在。我给的key也写对了,数据类型也兼容
这里有一些额外的信息:
- 我尝试通过重新启动服务器来解决问题。没有。
- 远程调试不是一个选项。
- 我用 retrieved.EntityCollection.Entities[i]["new_name"] 交换了 "retrieved.EntityCollection.Entities[i][forField]",一切正常(这里有点明显,但 "new_name" 不是我尝试访问的密钥)。
- 执行停止@"if (retrieved.EntityCollection.Entities[i][forField].ToString() != "" && !overwriteExisting)"
你有什么想法可以帮助我吗?
public void GenerateNumberForEntityCollection(string target)
{
try
{
// variables for number generation
bool overwriteExisting = (bool)preImageEntity["new_overwriteexisting"];
int suffixstart = (int)preImageEntity["new_suffixstart"];
string forField= preImageEntity["new_forfield"].ToString();
string prefix = preImageEntity["new_prefix"].ToString();
string postfix = preImageEntity["new_postfix"].ToString();
string separator = preImageEntity["new_separator"].ToString();
// Build query to get all the entries
RetrieveMultipleResponse retrieved;
int PageNumber = 1;
string PagingCookie = string.Empty;
int PageSize = 5000;
string[] Columns = { forField };
QueryExpression query = new QueryExpression()
{
EntityName = target,
ColumnSet = new ColumnSet(Columns),
PageInfo = new PagingInfo()
{
PageNumber = 1,
Count = PageSize
}
};
do
{
if (PageNumber != 1)
{
query.PageInfo.PageNumber = PageNumber;
query.PageInfo.PagingCookie = PagingCookie;
}
RetrieveMultipleRequest retrieve = new RetrieveMultipleRequest();
retrieve.Query = query;
retrieved = (RetrieveMultipleResponse)service.Execute(retrieve);
// Now that all entities are retrieved, iterate through them to gen. the numbers
int i = 0;
foreach (Entity entity in retrieved.EntityCollection.Entities)
{
if (retrieved.EntityCollection.Entities[i][forField].ToString() != "" && !overwriteExisting)
{
//continue;
}
else
{
retrieved.EntityCollection.Entities[i][forField] = prefix + separator + suffixstart.ToString() + separator + postfix;
}
suffixstart++;
service.Update(retrieved.EntityCollection.Entities[i]);
i++;
}
if (retrieved.EntityCollection.MoreRecords)
{
PageNumber++;
PagingCookie = retrieved.EntityCollection.PagingCookie;
}
} while (retrieved.EntityCollection.MoreRecords);
}
catch (Exception e)
{
tracing.Trace("GenerateNumberForEntityCollection: Failed: {0}", e.ToString());
}
}
你是如何验证密钥存在的?
如果 字段中的数据为 null,实体实例 将不包含该键 ,即使您在查询的列集。
这将为您 return 一个布尔值,指示该键是否存在于实体中。您可以在尝试读取属性之前执行此控制。
var attributeExists = retrieved.EntityCollection.Entities[i].Contains(forField)
如果该字段为空,您所做的下面的控制将导致您得到的异常。只要确保该属性之前存在即可。
retrieved.EntityCollection.Entities[i][forField].ToString() != ""
此外,如果查询中没有记录 return,您将得到空引用异常。让你对 retrieved.EntityCollection.Entities.
当您在 Dynamics CRM 中查询数据时,请务必了解数据库中具有 null
值的记录字段不包含在 Entity
实例的 Attributes
集合中被退回。
使用此构造从 Entity
的 Attribute
获取值:
var value = retrieved.EntityCollection.Entities[i][forField].ToString();
当属性 forField
已在数据库中具有值时成功,但当其当前值为 null
.
因此,从实体获取属性值的首选方法是 GetAttributeValue<T>
,如下所示:
var value = retrieved.EntityCollection.Entities[i].getAttributeValue<string>(forField);
此方法returns当属性存在于属性集合中时取值,否则returnsnull
.
If any of the fields among (new_forfield,new_prefix,new_postfix,new_separator) has null value, that column does not present in the retrieved object and you are trying to get the value of null column preImageEntity["new_forfield"] which will throw keynotfound'-exception ,
so change the code
string forField= preImageEntity["new_forfield"].ToString();
string prefix = preImageEntity["new_prefix"].ToString();
string postfix = preImageEntity["new_postfix"].ToString();
string separator = preImageEntity["new_separator"].ToString();
至
string forField = preImageEntity.Attributes.Contains("new_forfield")? preImageEntity["new_forfield"].ToString():"";
string prefix = preImageEntity.Attributes.Contains("new_forfield") ? preImageEntity["new_prefix"].ToString() : "";
string postfix = preImageEntity.Attributes.Contains("new_forfield") ? preImageEntity["new_postfix"].ToString() : "";
string separator = preImageEntity.Attributes.Contains("new_forfield") ? preImageEntity["new_separator"].ToString() : "";
this will check for field, if it exists than will parse the value to string else will assign empty string.