我正在将MS Dynamics CRM SDK与C#一起使用。在这里,我有一个WCF服务方法,它创建一个实体记录。
我在方法中使用CreateRequest
。客户端立即使用两个相同的请求调用此方法。
在创建记录之前需要进行提取。如果记录可用,我们将对其进行更新。但是,在正确的时间发生了2次插入。 因此,将在CRM中创建具有相同数据的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 Key和Upsert requests,但不幸的是,如果您使用CRM 2013,这不是您的选择。
在您的场景中,我可能会使用MemoryCache
库(small example)中的System.Runtime.Caching.dll
对象在WCF服务中实现非常轻量级的缓存。在执行对CRM的查询之前,您可以检查记录是否存在于缓存中,如果不存在,则继续进行当前处理(记住将记录添加到缓存中的有效期限短,以进行潜在的并发执行)或处理该记录。记录已经存在于缓存中的情况(在这里,您可以进行相当复杂的检查以检测并防止潜在的数据丢失/不必要的更新,变成简单而愚蠢的Thread.Sleep(1000)
)。