我是微软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 来查看下。

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

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

  1. using Microsoft.Xrm.Client;
  2. using Microsoft.Xrm.Client.Services;
  3. using Microsoft.Xrm.Sdk;
  4. using System;
  5. using System.ServiceModel;
  6.  
  7. namespace LuoYongLab
  8. {
  9. class Program
  10. {
  11. static void Main(string[] args)
  12. {
  13. try
  14. {
  15. var orgService = new OrganizationService(new CrmConnection("CRM"));
  16. var testEntity = new Entity("ly_test", "ly_alternatekey", "");
  17. testEntity["ly_name"] = "罗勇测试记录一修改";
  18. orgService.Update(testEntity);
  19. //请记住键名使用的是备用键字段名,而不是备用键的名称
  20. testEntity = new Entity("ly_test", new KeyAttributeCollection { { "ly_alternatekey", "" } });
  21. testEntity["ly_name"] = "罗勇测试记录二修改";
  22. orgService.Update(testEntity);
  23. var testSubEntity = new Entity("ly_testsub");
  24. testSubEntity["ly_name"] = "测试使用备用键来创建查找字段的值";
  25. testSubEntity["ly_test"] = new EntityReference("ly_test", "ly_alternatekey", "");
  26. orgService.Create(testSubEntity);
  27. Console.WriteLine("程序运行完成");
  28. Console.ReadKey();
  29. }
  30. catch (FaultException ex)
  31. {
  32. Console.WriteLine("程序出现异常:ex.Message=" + ex.Message);
  33. Console.WriteLine("ex.StackTrace=" + ex.StackTrace);
  34. Console.ReadKey();
  35. }
  36. }
  37. }
  38. }

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

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

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

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

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

介绍Dynamics 365 Customer Engagement中的备用键(alternate key)的更多相关文章

  1. Dynamics 365 Customer Engagement中插件的调试

    微软动态CRM专家罗勇 ,回复319或者20190319可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文主要根据官方的教 ...

  2. Dynamics 365 Customer Engagement中使用JavaScript和C#调用操作Action示例

    微软动态CRM专家罗勇 ,回复334或者20190509可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Action (操作)是流程的一种,可以在工作流中调用,可以使用 ...

  3. Dynamics 365 Customer Engagement 中对API的调整内容分享

    当前版本中弃用了以下客户端 API 以重新组织 Xrm 客户端 API 对象模型,从而更好地满足以下需求:使用同一客户端脚本而不必基于上下文或基于运行这些脚本的客户端(Web 客户端或新的统一接口)来 ...

  4. 嵌入Canvas App到Dynamics 365 Customer Engagement(Model-Driven App)中,创造更多可能!

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  5. 配置基于服务器认证的Dynamics 365 Customer Engagement和SharePoint Online集成

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  6. 如何让用户登录Dynamics 365 Customer Engagement后自动登录到Unified Interface App?

    微软动态CRM专家罗勇 ,回复324或者20190422可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...

  7. Dynamics 365 Customer Engagement安装FAQ

    微软动态CRM专家罗勇 ,回复310或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文参考了包括但不限 ...

  8. Dynamics 365 Customer Engagement的标准导入不支持并行导入了吗?

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

  9. Dynamics 365 Customer Engagement导入解决方案时出错:Microsoft.Crm.CrmException: Plug-in assembly does not contain the required types or assembly content cannot be updated.

    我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...

随机推荐

  1. Delphi解析修改Json文件,基于superobject.pas(ISuperObject)

    在经过一系列的波折后,还是觉得delphi读取并修改json文件来的方便: 在网络上找到一个delphi的三方库ISuperObject,添加到项目后直接引用就行: 下载地址 ISuperObject ...

  2. JavaScript图形实例:纺织物图案

    1.简单纺织物图案 先在HTML页面中设置一个画布. <canvas id="myCanvas" width="360" height="240 ...

  3. python 打飞机项目 (实战一)

    第一步定义 main 函数: # -*- coding=utf-8 -*- import pygame,time from Plane import Plane from pygame.locals ...

  4. weblogic启动服务器Authentication denied: Boot identity not valid

    新分配的测试服务器,已经安装好了weblogic,使用命令nohub ./startWeblogic.sh启动weblogic没有问题 登录控制台,点击环境-服务器-新建,一步步完成后,点击部署.选择 ...

  5. Mysql - 高可用方案之MM+Keepalived

    一.概述 本文将介绍mysql的MM+Keepalived方案.该方案由两个mysql服务器组成,这两个mysql互为主备.其中一台主作为写服务器,另一台主作为读服务器.通过keepalived软件管 ...

  6. Android 8.1 SystemUI虚拟导航键加载流程解析

    需求 基于MTK 8.1平台定制导航栏部分,在左边增加音量减,右边增加音量加 思路 需求开始做之前,一定要研读SystemUI Navigation模块的代码流程!!!不要直接去网上copy别人改的需 ...

  7. 使用objc runtime实现iOS绿色的懒加载

    使用objc runtime实现懒加载 地址:AutoPropertyCocoa 本文所指懒加载形式如下 - (id)lazyloadProperty{ if(_lazyloadProperty == ...

  8. PWA学习笔记(二)

    设计与体验 APP Shell: 1.应用从显示内容上可粗略划分为内容部分和外壳部分,App Shell 就是外壳部分,即页面的基本结构 2.它不仅包括用户能看到的页面框架部分,还包括用户看不到的代码 ...

  9. SQL Server 之事务执行,让语句在事务中执行

    BEGIN TRAN     BEGIN  TRY DELETE FROM dbo.表 INSERT INTO  dbo.表(    Id,   字段....) SELECTId,字段...    F ...

  10. C#中巧用妙法避免嵌套方式使用两个foreach循环

    问题:需要对DataGridViewRow的下拉框列Item2所选内容进行判断,看是否跟数据库里面某个配置表的数据列Item1匹配.如果用两个foreach循环进行匹配,会导致逻辑复杂而且容易只bre ...