Исключение 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. 
 Peter Majeed28 мар. 2012 г., 21:52
Этот тип ошибки исчезнет, если вы используете раннее связывание и приведете возвращенные сущности к экземплярам вашегоCustomer организация.

Ответы на вопрос(4)

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

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

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

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

 Yaqub Ahmad29 мар. 2012 г., 13:09
Имя поля в порядке.
 glosrob29 мар. 2012 г., 21:00
На самом деле это очень хороший момент. Если это пользовательская сущность, то все поля (кроме созданных по умолчанию, созданных и т. Д.), Насколько я знаю, будут иметь префикс.

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

Решение Вопроса

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

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

foreach (Entity myCustomer in retrieved.Entities)
{
    if (myCustomer.Attributes.ContainsKey("defaultcustomer"))
    {
        myCustomer["defaultcustomer"] = false;
    }
    else
    {
        myCustomer.Attributes.Add("defaultcustomer", false);
    }
    service.Update(myCustomer);
}
 Peter Majeed28 мар. 2012 г., 21:55
Это возможно, даже если он явно включает этот атрибут вColumnSet новогоQueryExpression?
 Yaqub Ahmad29 мар. 2012 г., 04:13
Это не работает для меня.
 Peter Majeed29 мар. 2012 г., 15:13
@glosrob: Может быть, это еще одна причина не использовать позднюю привязку. Наша группа вообще не использует позднюю привязку, но я ожидаю, что если вы явно включите атрибут и его значение будетNULLатрибут будет присутствовать в коллекции атрибутов со значениемNULL и будет доступен для присвоения значения.
 glosrob29 мар. 2012 г., 08:02
Какую ошибку / другую информацию вы получаете?
 glosrob29 мар. 2012 г., 08:02
@PeterMajeed - насколько я знаю, если в поле нет значения, оно не будет возвращено.

Ваш ответ на вопрос