在创建实体时,设置一个来自外部源的 属性 值,使其持续存在

On Create entity, set a property value from an external source so it persists

使用 Dynamics 365,我为了完成我需要做的事情而跳了很多圈。

基本上对于创建联系人,我有一个插件将实体对象反序列化为 XML,然后 post 将 XML 反序列化为 webhook。 webhook 对另一个系统做了一些事情并取回了一个 ID。然后将此 ID 返回给插件。

我已经设置了我想在插件中设置这个ID的属性:

 var response = webClient.UploadString(serviceUrl, serializedStr);
                            postMessageImage["po_ContactCRPID"] = response.ToString();

没有发生错误,确实创建了联系人,但我有兴趣更新的字段未在 CRM 中显示值。

我无法在 post 创建时使用 D365 中的常规 webhook 函数,因为获得 posted 的 JSON 不允许您序列化回对象然后能够很好地提取值然后插入后端的其他系统,所以我试图尽可能多地使用强类型类。

关于如何实现这个的任何想法?在 post 操作管道上,我希望能够根据从某些 Web 服务返回的值在联系人对象(具有自定义字段)上设置 属性,以便 CRM 可以创建联系人我设置的值。

这是我的插件代码:

 if (context.PostEntityImages.Contains("CreateContactImage") && context.PostEntityImages["CreateContactImage"] is Entity)
                {
                    tracingService.Trace("AccountSync: CreateContactImage.");

                    Entity postMessageImage = (Entity)context.PostEntityImages["CreateContactImage"];
 using (var client = new WebClient())
                    {
                        var webClient = new WebClient();
                        webClient.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";

                        var code = "CodeFromPlugin";
                        var serviceUrl = this.CRPSyncServiceUrl + "?code=" + code;

                        var entitySeri = new EntitySerializer();
                        var serializedStr = entitySeri.SerializeObject(postMessageImage);
try
                        {
                            // upload the data using Post mehtod
                             //var response = webClient.UploadData(serviceUrl, entityBytes);
                            var response = webClient.UploadString(serviceUrl, serializedStr);
                            postMessageImage["po_ContactCRPID"] = response.ToString();
                            postMessageImage.Attributes["po_ContactCRPID"] = response.ToString();
                            tracingService.Trace("Set postMessageImage po_ContactCRPID to: {0}", response.ToString());
                        }
                        catch (Exception ex)
                        {
                            tracingService.Trace("WebEX Error: {0}", ex.ToString());
                            throw;
                        }
                    }

                }

在异步 post-create 插件中,您将在刚刚创建的 Contact 目标中拥有 EntityId。

从 webhook 响应中获取 ID,然后组成一个新的 Contact 对象,设置属性 & service.Update 将保存它。

Entity contact = new Entity(“contact”);
contact.Id = target.Id;
contact[“webhook_Idfield”] = ID;
service.Update(contact);

image不是create操作的target

image 只为您提供 只读 记录值之前或 post 特定事件的快照。

target 通过事件管道传递。 target 表示保存到数据库中的可编辑 对象。

例如;如果你考虑一个 CreateRequest,它有一个 target 属性。这个请求基本上就是用户保存记录时发生的事情。

Entity contact = new Entity("contact");
contact["firstname"] = "James";

CreateRequest cr = new CreateRequest
{
    Target = contact
};

您可以像这样在您的插件中访问 target

Entity target = (Entity)context.InputParameters["Target"];
target.GetAttributeValue<string>("firstname"); //James

您可以像这样在 target 上设置值:

target["lastname"] = "Wood";

"Wood" 将沿着事件管道传递并进入数据库,如果 您的插件已注册为同步和预事件。否则(例如 post-事件,异步)当您设置 target 时为时已晚 - 数据已经保存到数据库中。

如果您能满足这些条件,请切换到使用 target。否则,您将需要发布单独的 UpdateRequest.

Entity update = new Entity("contact");
update.Id = target.Id;
update["lastname"] = "Wood";

Service.Update(update);