Исключение CRM 2011 KeyNotFoundException

Я новичок в разработке CRM. У меня есть Custom Entity "Клиент". Эта сущность имеет поле с именем defaultcustomer, которое может быть TRUE или FALSE. Я работаю над плагином, где мне нужно установить "defaultcustomer" в FALSE для всех "Клиентов". Я делаю это, как показано ниже:

ФАКТЫ:

Я зарегистрировал плагин для самой сущности "клиент". Поэтому, когда сущность "клиент" обновляется, плагин срабатывает.

private void MakeAllNonDefault()
{

    try
    {
        QueryExpression query = new QueryExpression("customer");
        query.ColumnSet = new ColumnSet("defaultcustomer");

        EntityCollection retrieved = service.RetrieveMultiple(query);

        foreach (Entity myCustomer in retrieved.Entities)
        {

            myCustomer["defaultcustomer"] = false;
            service.Update(myCustomer);
        }

    }
    catch (Exception ex)
    {
        throw new InvalidPluginExecutionException("An error occurred in MakeAllNonDefault(): " + ex.ToString());
    }
}

ОШИБКА: выдает ошибку в этой строке:

myCustomer["defaultcustomer"] = false;

System.Collections.Generic.KeyNotFoundException: 
The given key was not present in the dictionary. 

4 ответа

Решение

Ошибка означает, что конкретное поле отсутствует в наборе свойств. В CRM включены только свойства, которые были установлены или обновлены.

Попробуйте что-то вроде:

foreach (Entity myCustomer in retrieved.Entities)
{
    if (myCustomer.Attributes.ContainsKey("defaultcustomer"))
    {
        myCustomer["defaultcustomer"] = false;
    }
    else
    {
        myCustomer.Attributes.Add("defaultcustomer", false);
    }
    service.Update(myCustomer);
}

Вы дважды проверили, что поле действительно называется defaultcustomer?

Если это пользовательский объект, то, скорее всего, поле начинается с префикса, например, new_defaultcustomer. Убедитесь, что вы используете имя поля, а не отображаемое имя.

Решение, опубликованное @glosrob, кажется хорошим. Вы по-прежнему получаете сообщение "Данный ключ отсутствует в словаре"?

Попробуйте использовать ITracingService, чтобы получить больше информации о процессе выполнения плагина.

При обновлении все поля Crm являются ложными, примите то, что вы обновляете. Для этого вы можете использовать Pre/Post Images в плагине. Вы найдете тот ключ поля crm и обновите то, что вам нужно.

Другие вопросы по тегам