Исключение CRM 2011 KeyNotFoundException - PullRequest
2 голосов
/ 28 марта 2012

Я новичок в разработке 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 ]

7 голосов
/ 28 марта 2012

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

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

foreach (Entity myCustomer in retrieved.Entities)
{
    if (myCustomer.Attributes.ContainsKey("defaultcustomer"))
    {
        myCustomer["defaultcustomer"] = false;
    }
    else
    {
        myCustomer.Attributes.Add("defaultcustomer", false);
    }
    service.Update(myCustomer);
}
1 голос
/ 29 марта 2012

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

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

0 голосов
/ 04 августа 2014

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

0 голосов
/ 29 марта 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...