Dynamics CRM 2015/2016新特性之三十二:新增乐观并发处理
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复215或者20160328可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me 。
从Dynamics CRM 2015 UR1 开始,新增了乐观并发(Optimistic concurrency)处理。以前Dynamics CRM更新记录我称之为裸奔,它是不管你获取这条记录以后,别人是否做了更改,是直接Update这条记录,没有乐观并发一说。其实利用实体的RowVersion字段很容易做乐观并发的话,现在提供了,虽然有点姗姗来迟。
首先,要注意实体是否支持并发处理,绝大部分都是支持的,包括所有自己增加的实体。查看下很简单,打开元数据查看解决方案,看 IsOptimisticConcurrencyEnabled 属性是否为True即可。
![](https://img2018.cnblogs.com/blog/779910/201905/779910-20190520224226622-527126981.jpg)
从SDK表述来看,启用乐观并发只用于SDK调用,在CRM界面更新记录目前是不启用的。
我们以实际的例子来看看:
我们以实际的例子来看看:
using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Query; using System; using System.ServiceModel; namespace LuoYongLab { class Program { static void Main(string[] args) { try { var orgService = new OrganizationService(new CrmConnection("CRM")); var accountEntity = orgService.Retrieve("account", new Guid("FB243517-37A3-E511-80C7-000D3A807EC7"), new ColumnSet("name")); Console.WriteLine("查找到的客户名称是: " + accountEntity.GetAttributeValue<string>("name")); Console.WriteLine("请在CRM中更改下这个客户的值后按回车键继续!"); Console.ReadKey(); accountEntity["name"] = "素格格新疆特产店-通过代码修改的"; UpdateRequest accountUpdate = new UpdateRequest() { Target = accountEntity, ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches }; orgService.Execute(accountUpdate); Console.WriteLine("程序运行完成"); Console.ReadKey(); } catch (FaultException ex) { Console.WriteLine("程序出现异常:ex.Message=" + ex.Message); Console.ReadKey(); } } } }
运行程序后,提示我修改记录的时候我改动下,然后再Update就会跑出异常了:
![](https://img2018.cnblogs.com/blog/779910/201905/779910-20190520224343506-1088283538.jpg)
当然,如果你没有查询就直接更新的话会碰到另外一个异常,代码截图都如下:
using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Query; using System; using System.ServiceModel; namespace LuoYongLab { class Program { static void Main(string[] args) { try { var orgService = new OrganizationService(new CrmConnection("CRM")); var accountEntity = new Entity("account"); accountEntity.Id = new Guid("FB243517-37A3-E511-80C7-000D3A807EC7"); accountEntity["name"] = "素格格新疆特产店-通过代码修改的"; UpdateRequest accountUpdate = new UpdateRequest() { Target = accountEntity, ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches }; orgService.Execute(accountUpdate); Console.WriteLine("程序运行完成"); Console.ReadKey(); } catch (FaultException ex) { Console.WriteLine("程序出现异常:ex.Message=" + ex.Message); Console.ReadKey(); } } } }
![](https://img2018.cnblogs.com/blog/779910/201905/779910-20190520224500916-963002660.jpg)
对于删除的乐观并发示例代码如下,记得要先查询下记录,再删除:
using Microsoft.Xrm.Client; using Microsoft.Xrm.Client.Services; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Messages; using Microsoft.Xrm.Sdk.Query; using System; using System.ServiceModel; namespace LuoYongLab { class Program { static void Main(string[] args) { try { var orgService = new OrganizationService(new CrmConnection("CRM")); var accountEntity = orgService.Retrieve("account", new Guid("FB243517-37A3-E511-80C7-000D3A807EC7"), new ColumnSet("name")); Console.WriteLine("查找到的客户名称是: " + accountEntity.GetAttributeValue<string>("name")); Console.WriteLine("请在CRM中更改下这个客户的值后按回车键继续!"); Console.ReadKey(); DeleteRequest request = new DeleteRequest() { Target = new EntityReference(accountEntity.LogicalName, accountEntity.Id), ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches }; orgService.Execute(request); Console.WriteLine("程序运行完成"); Console.ReadKey(); } catch (FaultException ex) { Console.WriteLine("程序出现异常:ex.Message=" + ex.Message); Console.ReadKey(); } } } }