Dynamics CRM 2015/2016新特性之三十二:新增乐观并发处理

关注本人微信和易信公众号: 微软动态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();
            }
        }
    }
}

 

posted @ 2019-05-20 22:47  微软MVP(15-18)罗勇  阅读(441)  评论(0编辑  收藏  举报