zoukankan      html  css  js  c++  java
  • 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();
                }
            }
        }
    }
  • 相关阅读:
    阅读笔记--- 04
    站立会议--06个人进度
    站立会议--05 个人
    站立会议---04个人
    场景分析
    站立会议---03个人
    站立会议---02 个人进度
    计算某一天距离今天多少天,多少小时,多少分钟
    改变图片颜色
    手动调整导航控制器中的viewcontroller
  • 原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_CRM_2016_New_Feature_Optimistic_Concurrency.html
Copyright © 2011-2022 走看看