Исключение 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 и обновите то, что вам нужно.