c# - '字典中不存在给定的键' - 但键存在

标签 c# dynamics-crm dynamics-crm-2013 keynotfoundexception

我目前正在开发 MS Dynamics CRM 2013 - 插件。 当我尝试将字符串值分配给实体字段的键时,它会给我“keynotfound”异常。

这让我毫 headless 绪,因为我可以验证 key 是否存在。我给的key也写对了,数据类型也兼容。

这里有一些额外的信息:

  • 我尝试通过重新启动服务器来解决问题。什么都没有。
  • 远程调试不是一种选择。
  • 我将“retrieved.EntityCollection.Entities[i][forField]”与 retrieved.EntityCollection.Entities[i][“new_name”] 交换,一切正常(这里有点明显,但“new_name”不是我尝试访问的 key )。
  • 执行停止 @ "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());
    }
}

最佳答案

你是如何验证 key 存在的?

如果字段中的数据为空,实体实例将不包含该键,即使您在查询的 ColumnSet 中指定它也是如此。

这将返回一个 bool 值,指示该键是否存在于实体中。您可以在尝试读取属性之前执行此控制。

var attributeExists = retrieved.EntityCollection.Entities[i].Contains(forField) 

如果该字段为空,您所做的下面的控制将导致您得到的异常。只需确保该属性之前存在即可。

retrieved.EntityCollection.Entities[i][forField].ToString() != ""

此外,如果查询未返回任何记录,您将得到一个空引用异常。让您对 retrieved.EntityCollection.Entities 进行空检查。

关于c# - '字典中不存在给定的键' - 但键存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36772068/

相关文章:

dynamics-crm - 客户关系管理 2013 : Update a read-only field value using Business Rule

c# - 出现错误0xc0000005时强制关闭应用

c# - 如何从非管理员帐户以管理员用户身份启动需要管理员权限的程序

c# - WPF如何根据窗口大小调整某个控件的大小?

c# - 对象未设置为引用

android - 使用 URL 打开 View Microsoft Dynamics CRM 移动客户端(适用于手机)

c# - 如何将 JSON 值映射到不同名称的模型属性

internet-explorer - 如何获取对嵌入在另一个应用程序中的 Internet Explorer 实例的 COM 引用

javascript - crm 2013 javascript 保存和刷新崩溃

dynamics-crm - 仅当我在 Dynamics crm 中更新浏览器时,字段才会更新