Dynamics CRM:CreateRequest并发问题

时间:2018-10-11 12:52:52

标签: c# dynamics-crm microsoft-dynamics dynamics-crm-2013

我正在将MS Dynamics CRM SDK与C#一起使用。在这里,我有一个WCF服务方法,它创建一个实体记录。 我在方法中使用CreateRequest。客户端立即使用两个相同的请求调用此方法。

在创建记录之前需要进行提取。如果记录可用,我们将对其进行更新。但是,在正确的时间发生了2次插入。 因此,将在CRM中创建具有相同数据的2条记录。

有人可以帮助防止并发吗?

2 个答案:

答案 0 :(得分:3)

您应强制执行重复检测规则并决定要执行的操作。 Read more

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;
    }
}

答案 1 :(得分:0)

正如Filburt在您的问题中评论的那样,首选方法是使用Alternate KeyUpsert requests,但不幸的是,如果您使用CRM 2013,这不是您的选择。

在您的场景中,我可能会使用MemoryCache库(small example)中的System.Runtime.Caching.dll对象在WCF服务中实现非常轻量级的缓存。在执行对CRM的查询之前,您可以检查记录是否存在于缓存中,如果不存在,则继续进行当前处理(记住将记录添加到缓存中的有效期限短,以进行潜在的并发执行)或处理该记录。记录已经存在于缓存中的情况(在这里,您可以进行相当复杂的检查以检测并防止潜在的数据丢失/不必要的更新,变成简单而愚蠢的Thread.Sleep(1000))。