1

谁能告诉我我做错了什么,我已经尝试了一个多星期了。

按照代码。

插件(执行)的意外异常:Microsoft.Crm.Sdk.Samples.ProjectTotalAmount:System.Collections.Generic.KeyNotFoundException:字典中不存在给定的键。

namespace Microsoft.Crm.Sdk.Samples
{
    public class ProjectTotalAmount : IPlugin
    {

        public void Execute(IServiceProvider serviceProvider)
        {

            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext) serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

            if (context.InputParameters.Contains("Target") &&
                context.InputParameters["Target"] is Entity)
            {

                IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
                IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);

                //create a service context
                var ServiceContext = new OrganizationServiceContext(service);
                //ITracingService tracingService = localContext.TracingService;

                Entity entity = (Entity)context.InputParameters["Target"];


                if (entity.LogicalName == "new_project")
                {


                    Guid projectGUID = ((EntityReference)entity["new_project"]).Id;
                    Entity a = service.Retrieve("new_project", ((EntityReference)entity["new_project"]).Id, new ColumnSet(true));

                    decimal totalAmount = 0;

                    try
                    {
                        //fetchxml to get the sum total of estimatedvalue
                        string new_amount_sum = string.Format(@" 
                        <fetch distinct='false' mapping='logical' aggregate='true'> 
                            <entity name='new_projectitem'> 
                                <attribute name='new_amount' alias='new_amount' aggregate='sum' /> 
                                <filter type='and'>
                                    <condition attribute='new_projectid' operator='eq' value='{0}' uiname='' uitype='' />
                                </filter>
                            </entity>
                        </fetch>", a.Id);

                        EntityCollection new_amount_sum_result = service.RetrieveMultiple(new FetchExpression(new_amount_sum));

                        foreach (var c in new_amount_sum_result.Entities)
                        {
                            totalAmount = ((Money)((AliasedValue)c["new_amount_sum"]).Value).Value;
                        }

                        //updating the field on the account
                        Entity acc = new Entity("new_project");
                        acc.Id = a.Id;
                        acc.Attributes.Add("new_amount", new Money(totalAmount));
                        service.Update(acc);


                    }
                    catch (FaultException ex)
                    {
                        throw new InvalidPluginExecutionException("An error occurred in the plug-in.", ex);
                    }
                }
            }

        }
    }   
}

插件的设置:

验证后同步执行模式服务器部署

4

1 回答 1

3

在我们开始查看您的代码之前,一些可以帮助您的提示...

  • 此错误通常意味着您的代码引用的属性不存在(或没有值)
  • 你还没有说你的插件是在哪条消息上注册的。这可能会影响运行时的可用参数
  • 您已经注释掉了您的tracingService变量,但这至少可以帮助您了解您的代码已经走了多远。恢复它并添加几行这样的行来跟踪您在失败之前的进度。此信息将写入客户端异常对话框中提供给您的错误日志。:

    tracingService.Trace("Project Id is {0}", projectGUID);` 
    

    tracingService.Trace("Number of returned records: {0}", new_amount_sum_result.Entities.Count);`
  • 以下行似乎完全多余,因为您只使用属性Idfroma并且它已经存在为entity.Id

    Entity a = service.Retrieve("new_project", ((EntityReference)entity["new_project"]).Id, new ColumnSet(true));

于 2012-06-06T14:05:25.540 回答