字典中不存在给定的密钥(dynamics 365插件)



我为主要实体"偶发事件"制作了一个插件,该插件在操作前阶段触发。我收到错误"字典中不存在给定的关键字"。我不确定这里可能出了什么问题,因为这是我的第一个插件。目的是检查实体"保修"中是否存在Case的序列号(zst_txtsn(

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Xrm.Sdk;
using System.ServiceModel;
using Microsoft.Xrm.Sdk.Query;
namespace ActiveWarranty
{
public class Class1 : 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 Case = (Entity)context.InputParameters["Target"];

IOrganizationServiceFactory serviceFactory =
(IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
try
{
string serialNumber = Case.Attributes["zst_txtsn"].ToString();
Entity Warranty = new Entity("zst_warranty");
QueryExpression query = new QueryExpression("zst_warranty");
query.ColumnSet = new ColumnSet(new string[] { "zst_name" });
query.Criteria.AddCondition("zst_serialno", ConditionOperator.Equal, serialNumber);
EntityCollection collection = service.RetrieveMultiple(query);
if (collection.Entities.Count > 0)
{
Case["zst_activewarranty"] = true;
}
else if (collection.Entities.Count == 0)
{
Case["zst_activewarranty"] = false;
}
service.Update(Case);
}
catch (FaultException<OrganizationServiceFault> ex)
{
throw new InvalidPluginExecutionException("An error occurred in FollowUpPlugin.", ex);
}
catch (Exception ex)
{
tracingService.Trace("FollowUpPlugin: {0}", ex.ToString());
throw;
}
}
}
}
}
Any help would be much appreciated.

当对象为null时,.ToString()将抛出错误。你可以试试这些。

string serialNumber = Case.Attributes["zst_txtsn"] + "";

string serialNumber = "";
if(Case.GetAttributeValue<string>("zst_txtsn") != null)
{
serialNumber = Case.GetAttributeValue<string>("zst_txtsn").ToString();
}

需要注意的几点

1-如果此插件在创建事件中注册service.update(case(将失败,因为Target还没有id在这种情况下,应该在没有服务的情况下对目标进行任何更新。更新

2-如果这个插件在更新事件中注册,如果你没有在插件注册工具中正确设置触发器的过滤属性,它将导致循环。此外,由于它处于预阶段,因此使用布尔值更新目标以将其传递给平台就足够了。

在以上两种情况下,您都应该删除服务。更新

3-如果zstrongeriano是一个查找,并且您正在使用序列号文本值进行查询那么您的查询是错误的您必须使用LinkEntities/$expand按相关实体属性进行查询

最新更新