“字典中不存在给定的密钥”-但是密钥存在 - c#

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

这使我毫无头绪,因为我可以验证密钥是否存在。我提供的密钥也已正确写入,并且数据类型也兼容。

这里是一些额外的信息:

我尝试解决服务器重新启动的问题。没有。
不能进行远程调试。
我将“ retrieved.EntityCollection.Entities [i] [forField]”换成Retrieveed.EntityCollection.Entities [i] [“ new_name”],一切都正常工作(有点明显的意思,但“ 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());
    }
}

参考方案

在Dynamics CRM中查询数据时,重要的是要知道数据库中具有null值的记录字段不包含在要返回的Attributes实例的Entity集合中。

使用以下结构从EntityAttribute获取值:

var value = retrieved.EntityCollection.Entities[i][forField].ToString();

当属性forField在数据库中已经有一个值时成功,但是当其当前值为null时失败。

因此,从实体获取属性值的首选方法是GetAttributeValue<T>,如下所示:

var value = retrieved.EntityCollection.Entities[i].getAttributeValue<string>(forField);

当属性存在于属性集合中时,此方法返回值,否则返回null

45码