Чистый способ выполнения операции upsert (обновление или вставка) в Dynamics CRM 4

В настоящее время я использую следующий код для выполнения «upsert» в CRM.

try
{
 crm.Create(c);
} 
catch (SoapException)
{
 crm.Update(c);
}

Прав ли я, предполагая, что этот тип обновления сотрет всю существующую информацию из моего бизнес-объекта? И если да, то как я могу обновить сущность из репозитория? Мне нужны fetch, retrieve или что-то в этом роде?

Спасибо.


person Dmitri Nesteruk    schedule 06.12.2010    source источник
comment
Будет ли информация «c» удалена или нет, зависит от того, как она определена. Во время обновления обновляются только ненулевые атрибуты. Не могли бы вы показать, как бы вы определили «с» в описанном контексте?   -  person ccellar    schedule 08.12.2010


Ответы (1)


Использование обработки исключений для управления потоком плохо в 99,99% случаев; в этом случае, среди прочего, потому что вы никогда не знаете, какова фактическая причина вашего SoapException.

Гораздо чище было бы проверить, имеет ли поле идентификатора вашей записи значение; если это так, выполните обновление, если нет, выполните создание (и, возможно, добавьте полученный идентификатор к вашему объекту, если вы будете использовать его дальше). (Мы видели, как Create для записи с идентификатором действительно обновлялось несколько лет назад, но нам никогда не удавалось воспроизвести это.)

В остальном @ckeller совершенно прав; атрибут, который имеет значение null в вашем объекте (потому что его не было в ColumnSet при извлечении из базы данных или он не был установлен иным образом), не будет затронут в обновлении.

person TeaDrivenDev    schedule 09.12.2010