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

C# 字典中不存在给定的密钥(dynamics 365插件),c#,plugins,dynamics-crm,dynamics-365,C#,Plugins,Dynamics Crm,Dynamics 365,我为主要实体“事件”制作了一个插件,该插件在操作前阶段触发。我收到错误“字典中不存在给定的密钥”。因为这是我的第一个插件,所以我不确定这里会出什么问题。目的是检查实体“保修”中是否存在案例的序列号(zst_txtsn) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Xrm.Sdk;

我为主要实体“事件”制作了一个插件,该插件在操作前阶段触发。我收到错误“字典中不存在给定的密钥”。因为这是我的第一个插件,所以我不确定这里会出什么问题。目的是检查实体“保修”中是否存在案例的序列号(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.
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用Microsoft.Xrm.Sdk;
使用System.ServiceModel;
使用Microsoft.Xrm.Sdk.Query;
名称空间活动保修
{
公共类1:IPlugin
{
public void Execute(IServiceProvider服务提供程序)
{
ITracingService跟踪服务=
(ITracingService)serviceProvider.GetService(类型(ITracingService));
IPluginExecutionContext上下文=(IPluginExecutionContext)
GetService(typeof(IPluginExecutionContext));
if(context.InputParameters.Contains(“目标”)&&
context.InputParameters[“Target”]是实体)
{
实体大小写=(实体)上下文.InputParameters[“Target”];
I组织服务工厂服务工厂=
(IOOrganizationServiceFactory)服务提供者.GetService(类型为(IOOrganizationServiceFactory));
IOOrganizationService=serviceFactory.CreateOrganizationService(context.UserId);
尝试
{
string serialNumber=Case.Attributes[“zst_txtsn”].ToString();
实体担保=新实体(“zst_担保”);
QueryExpression查询=新的QueryExpression(“zst_保修”);
query.ColumnSet=newcolumnset(新字符串[]{“zst_name”});
query.Criteria.AddCondition(“zst_serialno”,ConditionOperator.Equal,serialNumber);
EntityCollection集合=service.RetrieveMultiple(查询);
如果(collection.Entities.Count>0)
{
案例[“zst_活动保修”]=真实;
}
else if(collection.Entities.Count==0)
{
案例[“zst_活动保修”]=虚假;
}
服务更新(案例);
}
捕获(FaultException-ex)
{
抛出新的InvalidPlugineExecutionException(“FollowUpPlugin中发生错误。”,ex);
}
捕获(例外情况除外)
{
tracingService.Trace(“FollowUpPlugin:{0}”,例如ToString());
投掷;
}
}
}
}
}
任何帮助都将不胜感激。

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

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

string serialNumber=”“;
if(Case.GetAttributeValue(“zst_txtsn”)!=null)
{
serialNumber=Case.GetAttributeValue(“zst_txtsn”).ToString();
}

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

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

string serialNumber=”“;
if(Case.GetAttributeValue(“zst_txtsn”)!=null)
{
serialNumber=Case.GetAttributeValue(“zst_txtsn”).ToString();
}
需要注意的几件事

一,- 如果此插件已在创建事件上注册 service.update(case)将失败,因为目标没有id 在这种情况下,任何更新都应该在不使用service.update的情况下在目标上完成

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

在上述两种情况下,您都应该删除service.update

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

一,- 如果此插件已在创建事件上注册 service.update(case)将失败,因为目标没有id 在这种情况下,任何更新都应该在不使用service.update的情况下在目标上完成

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

在上述两种情况下,您都应该删除service.update

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

我添加了您的建议,谢谢。虽然问题似乎再次与GUID关联…'FaultException`1:属性'zst_warranty.zst_serialno'的条件:应为'System.Guid'类型的参数,但收到'System.DBNull'。@Morgana ya我是这么想的,在前面的问题中,您说它是查找。复制此错误消息并在internet上搜索疑难解答提示,您也应该学会调试代码:)看起来您删除了另一篇文章-但从那里我了解到,不知何故,您正在填写序列号查找,但它在pre-create plugin中不可用。无论何时,只要在caseI中填写了序列号查找,您都应该尝试post create或post update添加您的建议,谢谢。虽然问题似乎再次与GUID关联…'FaultException`1:属性'zst_warranty.zst_serialno'的条件:应为'System.Guid'类型的参数,但收到'Syste'