介绍Dynamics 365 Customer Engagement中的备用键(alternate key)

我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复350或者20190813可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!

        从Dynamics CRM 2015 UR1开始新增了备用键,我做个简单介绍。以前Dynamics CRM实体的主键(primary key)都是Guid,现在新增了一种新的键,叫备用键。就是在实体中可以定义一个或者多个字段(属性)组成一个备用键,通过备用键可以唯一的确定实体中的一条记录,这个功能有点类似数据库中不能为空的唯一索引,通过备用键有如下三个好处:

  • 不需要通过其他本来可以唯一标识一条记录的实体字段值来查找实体的主键
  •  提升批量数据处理的吞吐量,特别是对于CRM Online来讲
  •  可以不借助CRM实体主键来CRM数据进行编程交互

我们这里实际来定义一个备用键看看,官方参考文档是 Define alternate keys for an entity  ,我这里实际操作下,步骤我都标注出来了。这里介绍的是通过CRM界面定义备用键的方法,通过编程也可以,我不做不介绍,可以自行参考 Use an alternate key to create a record

 

当然定义有限制,定义为备用键的字段只能是单行文本字段 或者 十进制字段 或者整数字段,一个实体最多定义5个备用键,一个备用键包含的字段不能超过16个或者字段长度(不是字段值实际占用擦长度,而是字段定义的最多字符)加起来超过900个字节。

创建备用键以后系统会启动一个作业来创建数据库的唯一索引,在 设置 > 系统作业 中可以看到,类似如下:

 

 成功以后我们可以看到数据库中也有唯一索引产生,我这里用 sp_help ly_TestBase 来查看下。

 

 备用键用途不错,可以根据备用键的值来更新记录,为查找字段赋值,我这里演示下,先创建两条记录,代码根据备用键来更新他们,也创建了一个罗勇测试辅助实体,它有一个查找字段,查找的就是罗勇测试这个实体,现有的两条记录如下:

 

然后我用如下的代码来更新这两条记录:

using Microsoft.Xrm.Client;
using Microsoft.Xrm.Client.Services;
using Microsoft.Xrm.Sdk;
using System;
using System.ServiceModel;

namespace LuoYongLab
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                var orgService = new OrganizationService(new CrmConnection("CRM"));
                var testEntity = new Entity("ly_test", "ly_alternatekey", "13926492254");
                testEntity["ly_name"] = "罗勇测试记录一修改";
                orgService.Update(testEntity);
                //请记住键名使用的是备用键字段名,而不是备用键的名称
                testEntity = new Entity("ly_test", new KeyAttributeCollection { { "ly_alternatekey", "13926492255" } });
                testEntity["ly_name"] = "罗勇测试记录二修改";
                orgService.Update(testEntity);
                var testSubEntity = new Entity("ly_testsub");
                testSubEntity["ly_name"] = "测试使用备用键来创建查找字段的值";
                testSubEntity["ly_test"] = new EntityReference("ly_test", "ly_alternatekey", "13926492254");
                orgService.Create(testSubEntity);
                Console.WriteLine("程序运行完成");
                Console.ReadKey();
            }
            catch (FaultException ex)
            {
                Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
                Console.WriteLine("ex.StackTrace=" + ex.StackTrace);
                Console.ReadKey();
            }
        }
    }
}

结果是如我所愿的,更新记录和创建记录为查找字段赋值也成功。

 

 

如果使用重复的备用键插件记录呢?当然会报错,界面报错如下:

在Web APi中使用备用键可以参考这个博文:Using alternate keys with the WebApi ,简单来说就是使用备用键对应的列及其值来查找及更新字段。 

如果备用键不是在实体创建后没有数据就建立的话,或者备用键从随实体从一个CRM环境迁移到另外一个环境,都有可能导致备用键对应的索引创建失败而导致备用键形同虚设。

所以最好是检查下备用创建是否成功,手工一个个检查?No!我这篇博文写了用代码做检查:使用代码检查Dynamics 365中的备用键状态

原文地址:https://www.cnblogs.com/luoyong0201/p/Dynamics_365_Introduce_Alternate_Key.html