Dynamics CRM: проблема параллелизма CreateRequest - PullRequest
0 голосов
/ 11 октября 2018

Я использую MS Dynamics CRM SDK с C #.В этом у меня есть метод службы WCF, который создает запись объекта.Я использую CreateRequest в методе.Клиент вызывает этот метод с двумя одинаковыми запросами один за другим сразу.

Перед созданием записи производится выборка.Если запись доступна, мы обновляем ее.Тем не менее, 2 вставки происходят в точное время.Таким образом, в CRM создаются 2 записи с одинаковыми данными.

Может ли кто-нибудь помочь предотвратить параллелизм?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вы должны применить правило обнаружения дубликатов и решить, что делать. Читать дальше

Account a = new Account();
a.Name = "My account";

CreateRequest req = new CreateRequest();
req.Parameters.Add("SuppressDuplicateDetection", false);
req.Target = a;
try
{
    service.Execute(req);
}
catch (FaultException<OrganizationServiceFault> ex)
{
    if (ex.Detail.ErrorCode == -2147220685)
    {
        // Account with name "My account" already exists
    }
    else
    {
        throw;
    }
}
0 голосов
/ 11 октября 2018

Как прокомментировал Филбурт в вашем вопросе, предпочтительным подходом будет использование альтернативного ключа и запросов Upsert , но, к сожалению, это не вариант для вас, если вы работаете с CRM2013.

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

...