关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复215或者20160328可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me
从Dynamics CRM 2015 UR1 开始,新增了乐观并发(Optimistic concurrency)处理。以前Dynamics CRM更新记录我称之为裸奔,它是不管你获取这条记录以后,别人是否做了更改,是直接Update这条记录,没有乐观并发一说。其实利用实体的RowVersion字段很容易做乐观并发的话,现在提供了,虽然有点姗姗来迟。
首先,要注意实体是否支持并发处理,绝大部分都是支持的,包括所有自己增加的实体。查看下很简单,打开元数据查看解决方案,看 IsOptimisticConcurrencyEnabled 属性是否为True即可。
 
从SDK表述来看,启用乐观并发只用于SDK调用,在CRM界面更新记录目前是不启用的。
我们以实际的例子来看看:
  1. using Microsoft.Xrm.Client;
  2. using Microsoft.Xrm.Client.Services;
  3. using Microsoft.Xrm.Sdk;
  4. using Microsoft.Xrm.Sdk.Messages;
  5. using Microsoft.Xrm.Sdk.Query;
  6. using System;
  7. using System.ServiceModel;
  8.  
  9. namespace LuoYongLab
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. try
  16. {
  17. var orgService = new OrganizationService(new CrmConnection("CRM"));
  18. var accountEntity = orgService.Retrieve("account", new Guid("FB243517-37A3-E511-80C7-000D3A807EC7"), new ColumnSet("name"));
  19. Console.WriteLine("查找到的客户名称是: " + accountEntity.GetAttributeValue<string>("name"));
  20. Console.WriteLine("请在CRM中更改下这个客户的值后按回车键继续!");
  21. Console.ReadKey();
  22. accountEntity["name"] = "素格格新疆特产店-通过代码修改的";
  23. UpdateRequest accountUpdate = new UpdateRequest()
  24. {
  25. Target = accountEntity,
  26. ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches
  27. };
  28. orgService.Execute(accountUpdate);
  29. Console.WriteLine("程序运行完成");
  30. Console.ReadKey();
  31. }
  32. catch (FaultException ex)
  33. {
  34. Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
  35. Console.ReadKey();
  36. }
  37. }
  38. }
  39. }

运行程序后,提示我修改记录的时候我改动下,然后再Update就会跑出异常了:

 
当然,如果你没有查询就直接更新的话会碰到另外一个异常,代码截图都如下:
  1. using Microsoft.Xrm.Client;
  2. using Microsoft.Xrm.Client.Services;
  3. using Microsoft.Xrm.Sdk;
  4. using Microsoft.Xrm.Sdk.Messages;
  5. using Microsoft.Xrm.Sdk.Query;
  6. using System;
  7. using System.ServiceModel;
  8.  
  9. namespace LuoYongLab
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. try
  16. {
  17. var orgService = new OrganizationService(new CrmConnection("CRM"));
  18. var accountEntity = new Entity("account");
  19. accountEntity.Id = new Guid("FB243517-37A3-E511-80C7-000D3A807EC7");
  20. accountEntity["name"] = "素格格新疆特产店-通过代码修改的";
  21. UpdateRequest accountUpdate = new UpdateRequest()
  22. {
  23. Target = accountEntity,
  24. ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches
  25. };
  26. orgService.Execute(accountUpdate);
  27. Console.WriteLine("程序运行完成");
  28. Console.ReadKey();
  29. }
  30. catch (FaultException ex)
  31. {
  32. Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
  33. Console.ReadKey();
  34. }
  35. }
  36. }
  37. }
 
对于删除的乐观并发示例代码如下,记得要先查询下记录,再删除:
  1. using Microsoft.Xrm.Client;
  2. using Microsoft.Xrm.Client.Services;
  3. using Microsoft.Xrm.Sdk;
  4. using Microsoft.Xrm.Sdk.Messages;
  5. using Microsoft.Xrm.Sdk.Query;
  6. using System;
  7. using System.ServiceModel;
  8.  
  9. namespace LuoYongLab
  10. {
  11. class Program
  12. {
  13. static void Main(string[] args)
  14. {
  15. try
  16. {
  17. var orgService = new OrganizationService(new CrmConnection("CRM"));
  18. var accountEntity = orgService.Retrieve("account", new Guid("FB243517-37A3-E511-80C7-000D3A807EC7"), new ColumnSet("name"));
  19. Console.WriteLine("查找到的客户名称是: " + accountEntity.GetAttributeValue<string>("name"));
  20. Console.WriteLine("请在CRM中更改下这个客户的值后按回车键继续!");
  21. Console.ReadKey();
  22. DeleteRequest request = new DeleteRequest()
  23. {
  24. Target = new EntityReference(accountEntity.LogicalName, accountEntity.Id),
  25. ConcurrencyBehavior = ConcurrencyBehavior.IfRowVersionMatches
  26. };
  27. orgService.Execute(request);
  28. Console.WriteLine("程序运行完成");
  29. Console.ReadKey();
  30. }
  31. catch (FaultException ex)
  32. {
  33. Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
  34. Console.ReadKey();
  35. }
  36. }
  37. }
  38. }

Dynamics CRM 2015/2016新特性之三十二:新增乐观并发处理的更多相关文章

  1. Dynamics CRM 2015/2016新特性之三十四:有了插件日志,调试插件so easy!

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复217或者20160330可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  2. Dynamics CRM 2015/2016新特性之三十三:有了ExecuteTransactionRequest,再也不用担心部分成功部分失败了

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复216或者20160329可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  3. Dynamics CRM 2015/2016新特性之七:有了文档模板,打印分析So Easy

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复190或者20160216可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 从CRM 2015 UR1开始, ...

  4. Dynamics CRM 2015/2016 Web API:Unbound Action 和 Bound Action

    上篇文章介绍了Bound/Unbound Function.今天我们来看看Action吧.像我之前说的:Function和Action之前的差别能够简单理解为.Function不改动数据,可是Acti ...

  5. Dynamics CRM 2015/2016 Web API:Unbound Function 和 Bound Function

    今天我们来看看Dynamics CRM Web API Function 吧, 这是一个新概念,刚接触的时候我也是比較的迷糊.这种命名确实是和之前的那套基于SOAP协议的API全然联系不上.好了,不说 ...

  6. Dynamics CRM 2015/2016 Web API:Unbound Custom Action 和 Bound Custom Action

    今天我们再来看看Bound/Unbound Custom Action吧,什么是Custom Action?不知道的小伙伴们就out了,Dynamics CRM 2013就有了这个功能啦.和WhoAm ...

  7. Dynamics CRM 2015/2016 Web API:新的数据查询方式

    今天我们来看看Web API的数据查询功能,尽管之前介绍CRUD的文章里面提到过怎么去Read数据,可是并没有详细的去深究那些细节,今天我们就来详细看看吧.事实上呢,Web API的数据查询接口也是基 ...

  8. Dynamics CRM 2015/2016 Web API:聚合查询

    各位小伙伴们,今天是博主2016年发的第一篇文章.首先祝大家新年快乐.工资Double,哈哈.今天我们来看一个比較重要的Feature--使用Web API运行FetchXML查询! 对的,各位.你们 ...

  9. 【原创】Dynamics CRM 2015/2016,以PDF的形式打开SSRS报表。

    基本步骤: 使用SSRS建立报表,以下的例子是以记录的GUID作为报表的参数 获取ReportSession 和 ControlId来调用报表 以PDF的形式预览报表 一.根据报表的名称获取报表的GU ...

随机推荐

  1. textarea中文本高亮选中

    最近在实现原文/译文句段高亮对比显示,和有道翻译类似,如下图所示: 最初的解决方案是采用富文本编辑器,把所有句段信息都用HTML标签包裹,操作空间比较大,页面上需要的功能几乎都可以实现,但是由此带来了 ...

  2. 【C#】学习笔记(4) 值类型和引用类型相关(Null相关)

    Reference and Value Types Value Types(值类型): struct(结构体) 独立的实例或者是拷贝 值的改变不会影响其它拷贝 值就是它所代表的信息 没有引用,所以不可 ...

  3. Unity3D_Transform_位置、角度、缩放及其他

    1.位置 transforn.position  世界位置 transform.localPosition 相对父类位置 在屏幕左上方显示方法: private void OnGUI() { GUIL ...

  4. 记录C#连接数据库工具类

    一.SQL Server /// <summary> /// 数据库的通用访问代码 /// 此类为抽象类, /// 不允许实例化,在应用时直接调用即可 /// </summary&g ...

  5. 算法复杂度O(logn)详解

    一.O(logn)代码小证明 我们先来看下面一段代码: int cnt = 1; while (cnt < n) { cnt *= 2; //时间复杂度为O(1)的程序步骤序列 } 由于cnt每 ...

  6. postman---Postman配置环境变量和全局变量

    我们在测试的过程中,遇到最多的问题也可以是环境的问题了吧,今天开发用了这个测试环境,明天又换了另一个测试环境,这样对于我们测试非常的麻烦,特别最接口的时候需要来回的输入环境地址比较麻烦,今天我们看看强 ...

  7. Druid-代码段-4-1

    所属文章:池化技术(一)Druid是如何管理数据库连接的? 本代码段对应主流程4,丢弃连接的守护线程: //连接池瘦身,参考主流程4 public class DestroyConnectionThr ...

  8. Cisco pppoe上网设置

    1.配置虚拟端口: interface Dialer1 ip address negotiated ip nat outside ip virtual-reassembly in encapsulat ...

  9. Day4- Python基础4 深浅拷贝、三目运算、列表生成式,迭代器&生成器、装饰器

    本节内容: 1.深浅拷贝 2.三目运算 3.迭代器和生成器 4.装饰器 1.深浅拷贝 拷贝意味着对数据重新复制一份,深浅拷贝的含义就是:对于修改复制的数据是否会影响到源数据,拷贝操作对于基本数据结构需 ...

  10. cf rock is push 【dp】

    附上学习的博客:https://blog.csdn.net/u013534123/article/details/102762673 大致题意:一个迷宫,里面有很多箱子,你可以向右或者向下走.当你遇到 ...