在“创建实体”上,从外部来源设置属性值,使其持久存在

时间:2018-09-03 18:51:41

标签: c# dynamics-crm dynamics-crm-online dynamics-365 dynamics-crm-365

使用Dynamics 365,我正在做很多跳跃的事情,以完成需要完成的工作。

基本上,对于创建联系人,我有一个插件,该插件将Entity对象反序列化为XML,然后将该XML发布到Webhook。 Webhook对另一个系统进行了一些处理,并获取了ID。然后,该ID将返回给插件。

我已经在插件中设置了要设置此ID的属性,

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

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

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

关于如何实现此目标的任何想法?在后期操作管道上,我希望能够基于从某些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;
                        }
                    }

                }

2 个答案:

答案 0 :(得分:3)

在异步创建后插件中,您将在刚刚创建的联系人的目标中具有EntityId。

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

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

答案 1 :(得分:2)

image不是target操作的create

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

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”将沿着事件管道传递并进入数据库,如果您的插件已针对同步和事前事件进行了注册。否则,当您设置target时(例如事件后,异步),为时已晚-数据已保存到数据库中。

如果可以满足这些条件,请切换为使用target。否则,您将需要发出单独的UpdateRequest

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

Service.Update(update);