关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复215或者20160328可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me
从Dynamics CRM 2015 UR1 开始,新增了乐观并发(Optimistic concurrency)处理。以前Dynamics CRM更新记录我称之为裸奔,它是不管你获取这条记录以后,别人是否做了更改,是直接Update这条记录,没有乐观并发一说。其实利用实体的RowVersion字段很容易做乐观并发的话,现在提供了,虽然有点姗姗来迟。
首先,要注意实体是否支持并发处理,绝大部分都是支持的,包括所有自己增加的实体。查看下很简单,打开元数据查看解决方案,看 IsOptimisticConcurrencyEnabled 属性是否为True即可。
 
从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就会跑出异常了:

 
当然,如果你没有查询就直接更新的话会碰到另外一个异常,代码截图都如下:
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();
}
}
}
}
 
对于删除的乐观并发示例代码如下,记得要先查询下记录,再删除:
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();
}
}
}
}

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. 【AGC035F】Two Histograms

    Problem Description 你有一个 \(N\) 行.\(M\) 列的.每个格子都填写着 0 的表格.你进行了下面的操作: 对于每一行 \(i\) ,选定自然数 \(r_i\) (\(0\ ...

  2. llinux/重启/用户切换/注销

    一.指令 shutdown命令 shutdown -h now //立即关机 shutdown -h 2 //分钟后关机 shutdown -r now //立即重启 shutdown -r 1 // ...

  3. socket调试工具(Mac版)

    基于Mac版的Socket测试功能,类似于PostMan的功能,对于Socket长链接的项目开发很有帮助. 本人也是通过好多渠道才找到这篇文章,与大家共享: 按照步骤一步一步来就对了~ 本文参考于:h ...

  4. [日常] windows下使用vscode配合xebug调试php脚本

    windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,php7.3应该是有的,php7.3.4好像没有默认是不加载这个扩展 ...

  5. TensorFlow从1到2(十四)评估器的使用和泰坦尼克号乘客分析

    三种开发模式 使用TensorFlow 2.0完成机器学习一般有三种方式: 使用底层逻辑 这种方式使用Python函数自定义学习模型,把数学公式转化为可执行的程序逻辑.接着在训练循环中,通过tf.Gr ...

  6. JVM-5-GC(Garbage Collection) 垃圾回收机制

    GC(Garbage Collection)  垃圾回收机制   什么是垃圾回收机制 垃圾回收是一种动态存储管理技术,它自动地释放不再被程序引用的对象,按照特定的垃圾收集算法来实现资源自动回收的功能. ...

  7. macOS 10.15 开启 HiDPI

    普通的显示,接上 MacBook 发现原生的分辨率设置在 2K 显示器上字体很小,换成 1080P 分辨率显示效果又特别模糊.下面介绍MacBook强行开启 HiDPI. 什么是 HiDPI 它使用横 ...

  8. Educational Codeforces Round 74 (Rated for Div. 2)

    传送门 A. Prime Subtraction 判断一下是否相差为\(1\)即可. B. Kill 'Em All 随便搞搞. C. Standard Free2play 题意: 现在有一个高度为\ ...

  9. 扩展KMP笔记

    KMP能计算一个字符串的每个位置前最长公共前缀后缀 扩展KMP可以用来计算两个字符串间的最长公共前缀后缀的…… 不过为了计算这个需要绕些弯路 已知字符串$S$和$P$,$S$的长度为$n$,$P$的长 ...

  10. 网络传播模型Python代码实现

    SI模型 import numpy as np import matplotlib.pyplot as plt import smallworld as sw #邻接矩阵 a = sw.a # 感染率 ...