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"];
這樣就不用在插件里面,再取一次實體的其它屬性了。