Dynamics 365 CE Update消息PostOperation阶段Image的尝试
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面的微软最有价值专家(Microsoft MVP),欢迎关注我的微信公众号 MSFTDynamics365erLuoYong ,回复355或者20190827可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!
前面的文章 Dynamics 365 CE在Pre Delete插件中应用Image 讲了Delete消息PreOperation阶段Image的应用,今天我们来看下Update 消息PostOperation阶段Image的尝试。
我使用如下代码简单注册一个插件:
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.ServiceModel;
using System.Text; namespace CRM.Plugins
{
public class PostWorkOrderUpdate : IPlugin
{
public void Execute(IServiceProvider serviceProvider)
{
ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
{
Entity currentEntity = (Entity)context.InputParameters["Target"];
IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
Entity preImgEntity;
Entity postImgEntity;
Entity retrieveEntity;
StringBuilder sb = new StringBuilder();
try
{
if (context.PreEntityImages.Contains("PreImg"))
{
preImgEntity = context.PreEntityImages["PreImg"];
}
else
{
throw new InvalidPluginExecutionException("Pre Update image - PreImg does not exist!");
}
if (context.PostEntityImages.Contains("PostImg"))
{
postImgEntity = context.PostEntityImages["PostImg"];
}
else
{
throw new InvalidPluginExecutionException("Post Update image - PostImg does not exist!");
}
retrieveEntity = service.Retrieve(currentEntity.LogicalName, currentEntity.Id, new ColumnSet("ly_singletext2", "ly_singletext3"));
if (retrieveEntity.Contains("ly_singletext2"))
{
sb.Append("retrieveEntity contains attribute ly_singletext2 = ");
sb.Append(retrieveEntity.GetAttributeValue<string>("ly_singletext2"));
sb.Append("; ");
}
else
{
sb.Append("retrieveEntity does not contain attribute ly_singletext2");
sb.Append("; ");
}
if (currentEntity.Contains("ly_singletext2"))
{
sb.Append("currentEntity contains attribute ly_singletext2 = ");
sb.Append(currentEntity.GetAttributeValue<string>("ly_singletext2"));
sb.Append("; ");
}
else
{
sb.Append("currentEntity does not contain attribute ly_singletext2");
sb.Append("; ");
}
if (preImgEntity.Contains("ly_singletext2"))
{
sb.Append("preImgEntity contains attribute ly_singletext2 = ");
sb.Append(preImgEntity.GetAttributeValue<string>("ly_singletext2"));
sb.Append("; ");
}
else
{
sb.Append("preImgEntity does not contain attribute ly_singletext2");
sb.Append("; ");
}
if (postImgEntity.Contains("ly_singletext2"))
{
sb.Append("postImgEntity contains attribute ly_singletext2 = ");
sb.Append(postImgEntity.GetAttributeValue<string>("ly_singletext2"));
sb.Append("; ");
}
else
{
sb.Append("postImgEntity does not contain attribute ly_singletext2");
sb.Append("; ");
}
if (retrieveEntity.Contains("ly_singletext3"))
{
sb.Append("retrieveEntity contains attribute ly_singletext3 = ");
sb.Append(retrieveEntity.GetAttributeValue<string>("ly_singletext3"));
sb.Append("; ");
}
else
{
sb.Append("retrieveEntity does not contain attribute ly_singletext3");
sb.Append("; ");
}
if (currentEntity.Contains("ly_singletext3"))
{
sb.Append("currentEntity contains attribute ly_singletext3 = ");
sb.Append(currentEntity.GetAttributeValue<string>("ly_singletext3"));
sb.Append("; ");
}
else
{
sb.Append("currentEntity does not contain attribute ly_singletext3");
sb.Append("; ");
}
if (preImgEntity.Contains("ly_singletext3"))
{
sb.Append("preImgEntity contains attribute ly_singletext3 = ");
sb.Append(preImgEntity.GetAttributeValue<string>("ly_singletext3"));
sb.Append("; ");
}
else
{
sb.Append("preImgEntity does not contain attribute ly_singletext3");
sb.Append("; ");
}
if (postImgEntity.Contains("ly_singletext3"))
{
sb.Append("postImgEntity contains attribute ly_singletext3 = ");
sb.Append(postImgEntity.GetAttributeValue<string>("ly_singletext3"));
sb.Append("; ");
}
else
{
sb.Append("postImgEntity does not contain attribute ly_singletext3");
sb.Append("; ");
}
throw new InvalidPluginExecutionException(sb.ToString());
}
catch (FaultException<OrganizationServiceFault> ex)
{
throw new InvalidPluginExecutionException("An error occurred in PostWorkOrderUpdate.", ex);
}
catch (Exception ex)
{
tracingService.Trace("PostWorkOrderUpdate unexpected exception: {0}", ex.Message);
throw;
}
}
}
}
}
插件注册信息如下:

我还为此Step注册了两个Image,一个为Pre阶段的Image,一个为Post阶段的Image,如下:


然后我进行了一系列测试:
如果两个字段都变化,获取到的消息如下:
retrieveEntity contains attribute ly_singletext2 = 5-New;
currentEntity contains attribute ly_singletext2 = 5-New;
preImgEntity contains attribute ly_singletext2 = 5;
postImgEntity contains attribute ly_singletext2 = 5-New;
retrieveEntity contains attribute ly_singletext3 = 总体满意度-New;
currentEntity contains attribute ly_singletext3 = 总体满意度-New;
preImgEntity contains attribute ly_singletext3 = 总体满意度;
postImgEntity contains attribute ly_singletext3 = 总体满意度-New;
如果只更改一个字段ly_singletext2的值,另外一个字段ly_singletext3不变,保存后获取的结果是:
retrieveEntity contains attribute ly_singletext2 = 5-New;
currentEntity contains attribute ly_singletext2 = 5-New;
preImgEntity contains attribute ly_singletext2 = 5;
postImgEntity contains attribute ly_singletext2 = 5-New;
retrieveEntity contains attribute ly_singletext3 = 总体满意度;
currentEntity does not contain attribute ly_singletext3;
preImgEntity contains attribute ly_singletext3 = 总体满意度;
postImgEntity contains attribute ly_singletext3 = 总体满意度;
如果只更改一个字段ly_singletext2的值,这里将其值清空,另外一个字段ly_singletext3不变,保存后获取的结果是:
retrieveEntity does not contain attribute ly_singletext2;
currentEntity contains attribute ly_singletext2 = ;
preImgEntity contains attribute ly_singletext2 = 5;
postImgEntity does not contain attribute ly_singletext2;
retrieveEntity contains attribute ly_singletext3 = 总体满意度;
currentEntity does not contain attribute ly_singletext3;
preImgEntity contains attribute ly_singletext3 = 总体满意度;
postImgEntity contains attribute ly_singletext3 = 总体满意度;
如果只更改一个字段ly_singletext2的值,本来该字段的值为空,这里设置其值为New,另外一个字段ly_singletext3的值一直为空保持不变,保存后获取的结果是:
retrieveEntity contains attribute ly_singletext2 = New;
currentEntity contains attribute ly_singletext2 = New;
preImgEntity does not contain attribute ly_singletext2;
postImgEntity contains attribute ly_singletext2 = New;
retrieveEntity does not contain attribute ly_singletext3;
currentEntity does not contain attribute ly_singletext3;
preImgEntity does not contain attribute ly_singletext3;
postImgEntity does not contain attribute ly_singletext3;
总结下:
- Target参数转换后的实体会包括所有要设置新值的字段(属性),如果要设置的新值为空值,也会包括该字段(属性),只是该字段(属性)的值为空。
- Target参数转换后的实体不会包括不更改的字段(属性)。
- Pre Update Image包括了字段更新之前的值,如果之前该字段的值为空值,则Pre Update Image不会包括这个字段(属性);
- Post Update Image包括了字段(属性)要更新的值,如果字段(属性)是更新为空值则Post Update Image不包括该字段,如果字段(属性)不更新的话,Post Update Image包括的就是这个字段(属性)的原值;
- 在Post Update阶段查询当前实体的字段(属性)值,查询到的是要变更的新值,如果字段(属性)要要更新为空值,查询结果的字段(属性)集中不会包括该字段(属性),所以不用再查询,直接从Target参数转换后的实体的字段(属性)集合中获取。
- 如果要看字段(属性)值在Update消息中是否变化的话,检查Target参数转换后的实体是否包括该字段(属性)即可,新值在Target参数转换后的实体的字段(属性)集合中,旧值可以用Pre Update Image来获取。
- 获取Image之前先检查Image是否存在,分别用类似context.PreEntityImages.Contains("PreImg") 或者 context.PostEntityImages.Contains("PostImg")。
- 获取字段(属性)值之前先检查字段(属性)的确存在,用类似 currentEntity.Contains("ly_singletext2") 的语法。
Dynamics 365 CE Update消息PostOperation阶段Image的尝试的更多相关文章
- Use SQL to Query Data from CDS and Dynamics 365 CE
from : https://powerobjects.com/2020/05/20/use-sql-to-query-data-from-cds-and-dynamics-365-ce/ Have ...
- 使用Dynamics 365 CE Web API查询数据加点料及选项集字段常用查询
微软动态CRM专家罗勇 ,回复336或者20190516可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me. 紧接上文:配置Postman通过OAuth 2 implicit ...
- Dynamics 365 CE中AsyncOperationBase表记录太多,影响系统性能怎么办?
微软动态CRM专家罗勇 ,回复311或者20190311可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文主要是根据微软官 ...
- Dynamics 365 CE将自定义工作流活动程序集注册到磁盘并引用其他类库
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...
- 安装完成Dynamics 365 CE后别忘了更改维护作业的运行时间
摘要: 微软动态CRM专家罗勇 ,回复309或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 安装完毕Dy ...
- Dynamics 365 CE中使用FetchXML进行聚合运算
微软动态CRM专家罗勇 ,回复328或者20190429可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
- Dynamics 365 CE命令栏按钮点击后刷新表单页面方法
微软动态CRM专家罗勇 ,回复326或者20190428可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! Dynamics 365 Customer Engagement ...
- 启用WCF压缩提升Dynamics 365 CE的网络性能
摘要: 微软动态CRM专家罗勇 ,回复307或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文系根据微 ...
- 做了面向互联网部署的Dynamics 365 CE更改AD FS的登录页面
摘要: 微软动态CRM专家罗勇 ,回复306或者20190307可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 默认情况下A ...
随机推荐
- conda pip 安装 dgl 并运行demo 出现:Segmentation fault (core dumped) 错误
安装dgl 并运行的时候,出现了如上错误,很是郁闷:使用 gdb python; run train.py 进行调试,发现是torch的问题:我猜测估计是torch 安装的版本过于新:于是重新安装 1 ...
- IO测试工具 - 用于IO测试 ; linux benchmarks
IO测试工具,用于磁盘IO测试,下面进行使用列表进行记录: iozone fio dd ioping iotop iostat bonnie++ crystalDisk Atto as-ssd-ben ...
- 面试连环炮系列(二):你们的项目Redis做了集群部署吗
你们的项目Redis做了集群部署吗? 我们有大量数据需要缓存,而单实例的容量毕竟是有限的,于是做了Redis集群部署. 采取的方案是什么,Codis还是Redis Cluster,为什么要选择这个方案 ...
- C# 多线程总结 异常处理 线程取消 锁(lock)
那么什么时候能用多线程? 任务能并发的时候 多线程能干嘛?提升速度/优化用户体验 网站首页:A数据库 B接口 C分布式服务 D搜索引擎,适合多线程并发,都完成后才能返回给用户,需要等待WaitAll列 ...
- Jmeter脚本参数化和正则匹配
我们在做接口测试过程中,往往会遇到以下几种情况 每次发送请求,都需要更改参数值为未使用的参数值,比如手机号注册.动态时间等 上一个接口的请求体参数用于下一个接口的请求体参数 上一个接口的响应体参数用于 ...
- C#中的时间戳
来源:https://blog.guoqianfan.com/2019/11/24/timestamp-in-csharp/ 什么是时间戳 时间戳默认是Unix时间戳. 首先要清楚JavaScript ...
- How to: Generate XPO Business Classes for Existing Data Tables 如何:为现有数据表生成 XPO 业务类
From the Tutorial and other documentation sources, you learned how to create business classes for yo ...
- Entity Framework Core Code First 项目实践
Entity Framework Core Code First 实践 任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它 ...
- SVN安装简介
博主最近换个份工作,代码管理用的是SVN,因为之前用的Git管理代码的,SVN没接触过,既然公司中要用,就学习下使用吧.从最基本的安装开始吧. SVN官网:https://tortoisesvn.ne ...
- 速查 NSArray NSSet NSHashTable 快速遍历之速度比较
因为NSArray中的指针并不是简单的连续存放的,所以简单的测试了Cocoa的三种集合的快速遍历(NSFastEnumeration)性能,给出简单的参考. 添加元素: [collection add ...