1. 问题描述
最近新建了一个post事件的插件,传入的参数处理如下:
1: if (context.InputParameters.Contains("Target") && context.InputParameters["Target"] is Entity)
2: {
3: Entity entity = (Entity)context.InputParameters["Target"];
4: …
5:
6: }
7:
Unit test 也正常pass:
但当我发布插件时,发现报错了,有属性没值,奇怪了,明明unit test通过了啊!
2. 解决方法1
后来在调用这个传进来的实体参数前,重新取一次,一切正常:
1: Entity entity = service.Retrieve(current.LogicalName, current.Id, new ColumnSet(new string[] { all }));
2:
后来才发现这个传进来的实体参数只有一些改变了的属性才会有值,而没有改变的属性则没有带进来。
3. 解决方法2
那么能不能把想要的属性带进来呢,是可以的,也就是说不用在插件里再取一次这个实体.
方法就是使用 “前期事件和后期实体映像”
PreEntityImages 和 PostEntityImages 包含核心平台操作之前 (pre) 和之后 (post) 的主要实体属性的快照。Microsoft Dynamics CRM 会基于模拟的系统用户的安全权限填充前期实体和后期实体映像。只有设置为某个值或 null 的实体属性才在前期或后期实体映像中可用。当您注册您的插件时,可以指定让平台填充这些 PreEntityImages 和 PostEntityImages 属性。插件代码会将您在插件注册期间指定的实体别名值用作插件代码中图像集合的键值。
某些事件没有可用的映像。例如,只有同步的后期事件和异步的注册插件填充了 PostEntityImages。创建操作不支持前期映像,删除操作不支持后期映像。
具体做法是,在注册插件及添加step后,右健step,选择注册新的映像
然后可以指定名称及哪些属性要传入插件:
这里指明后,在插件开始的地方就不用,
Entity entity = (Entity)context.InputParameters["Target"];
而是用下面的方式了:
(Entity)context.PreEntityImages["image"];
这样就不用在插件里面,再取一次实体的其它属性了。