Как прокомментировал Филбурт в вашем вопросе, предпочтительным подходом будет использование альтернативного ключа и запросов Upsert , но, к сожалению, это не вариант для вас, если вы работаете с CRM2013.
В вашем сценарии я бы реализовал очень легкий кэш в службе WCF, возможно, используя объект MemoryCache
из библиотеки System.Runtime.Caching.dll
( маленький пример ).Перед выполнением запроса в CRM вы можете проверить, существует ли запись в кэше, и продолжить текущую обработку, если это не так (не забывая добавить запись в кэш с небольшим сроком действия для возможных одновременных выполнений) или обработатьсценарий, в котором запись уже существует в кэше (и здесь вы можете перейти от довольно сложных проверок для обнаружения и предотвращения возможной потери данных / ненужных обновлений к простому и глупому Thread.Sleep(1000)
).