Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在窗体上同时运行2个验证时出错_C#_Dynamics Crm_Dynamics Crm 365 - Fatal编程技术网

C# 在窗体上同时运行2个验证时出错

C# 在窗体上同时运行2个验证时出错,c#,dynamics-crm,dynamics-crm-365,C#,Dynamics Crm,Dynamics Crm 365,我有实体信用额度,上面有三个字段,分别是信用评级、信用额度和配置,配置是一个查找字段,信用额度字段是货币,信用评级是选项集(a、B、C)。所以,当更新时,它将验证2次,首先是信用评级不能和字段配置已经具有的信用评级相同 示例:我的预信用评级为B,并且我的配置已经有2个信用限额,即A和B,当我将信用评级更新为A时,假设是错误的,因为配置不能有2个相同的信用评级 第二个验证是在更新字段信用额度时,因此当前信用额度不能超过preimage信用额度字段,我的preimage信用额度是500美元,当我尝试

我有实体信用额度,上面有三个字段,分别是信用评级、信用额度和配置,配置是一个查找字段,信用额度字段是货币,信用评级是选项集(a、B、C)。所以,当更新时,它将验证2次,首先是信用评级不能和字段配置已经具有的信用评级相同

示例:我的预信用评级为B,并且我的配置已经有2个信用限额,即A和B,当我将信用评级更新为A时,假设是错误的,因为配置不能有2个相同的信用评级

第二个验证是在更新字段信用额度时,因此当前信用额度不能超过preimage信用额度字段,我的preimage信用额度是500美元,当我尝试更新到550美元时,它将显示错误消息

所以我创建了两个插件来验证这两个条件,并且我的事件管道执行阶段都设置为PreOperation

,这里是信用评级验证

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using TrainingConfiguration.Plugins.Model;

namespace TrainingConfiguration.Plugins
{
    public class CreditRatingUpdateValidation : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            Entity entity = (Entity)context.InputParameters["Target"];
            IOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = (IOrganizationService)serviceFactory.CreateOrganizationService(context.UserId);
            if (entity.LogicalName.Contains("ita_creditlimit"))
            {

                Entity preImage = (Entity)context.PreEntityImages["CreditImage"];
                EntityReference configuration = (EntityReference)(preImage.Attributes["ita_configuration"]);
                string configurationId = configuration.Id.ToString();

                string fetchXml = @"<fetch version='1.0' output-format='xml-platform' mapping='logical' distinct='false'>
                      <entity name='ita_creditlimit'>
                      <attribute name='ita_creditlimitid' />
                      <attribute name='ita_name' />
                      <attribute name='ita_creditrating' />
                      <attribute name='ita_configuration' />
                      <order attribute='ita_name' descending='false' />
                      <filter type='and'>                     
                      <condition attribute='ita_configuration' operator='eq' value=""{0}"" /> 
                      </filter>
                      </entity>
                      </fetch>";
                fetchXml = string.Format(fetchXml, configurationId);
                var qe = new FetchExpression(fetchXml);
                var result = service.RetrieveMultiple(qe);
                var preRating = ((OptionSetValue)preImage.Attributes["ita_creditrating"]).Value;
                var postRating = ((OptionSetValue)entity.Attributes["ita_creditrating"]).Value;
                if (result.Entities.Count > 0)
                {
                    List<String> listCreditRating = new List<string>();                        
                    for (int i = 0; i < result.Entities.Count; i++)
                    {
                        string creditRating = ((OptionSetValue)result.Entities[i].Attributes["ita_creditrating"]).Value.ToString();                           
                        listCreditRating.Add(creditRating);
                    }


                    if (postRating.ToString() != preRating.ToString())
                    {
                        bool alreadyExist = listCreditRating.Contains(postRating.ToString());
                        if (alreadyExist == true)
                        {
                            throw new InvalidPluginExecutionException("Can't have 2 same rating");
                        }
                    }

                }
            }
        }
    }
}
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using TrainingConfiguration.Plugins.Model;

namespace TrainingConfiguration.Plugins
{
    public class CreditUpdateValidation : IPlugin
    {
        public void Execute(IServiceProvider serviceProvider)
        {
            IPluginExecutionContext context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));
            ITracingService tracingService = (ITracingService)serviceProvider.GetService(typeof(ITracingService));
            IOrganizationServiceFactory serviceFactory =
            (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));
            IOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);
            Entity entity = (Entity)context.InputParameters["Target"];

            if (entity.LogicalName.Equals("ita_creditlimit"))
            {
                decimal parseInt1 = 0;
                decimal parseInt2 = 0;
                Entity preImage = (Entity)context.PreEntityImages["CreditImage"];
                if (context.PreEntityImages.Contains("CreditImage"))
                {
                    Money preValue = (Money)preImage.Attributes["ita_creditlimit"];

                    parseInt1 = preValue.Value;
                }
                Money postValue = (Money)entity.Attributes["ita_creditlimit"];

                parseInt2 = postValue.Value;

                if (parseInt2 > parseInt1)
                {
                    throw new InvalidPluginExecutionException("Can't Exceed the credit limit");
                }

            }

        }
    }
}
这两个插件一开始都可以正常工作。在我尝试一起运行它之前,我不知道为什么我尝试运行它 一起运行它会有一个奇怪的异常,有时它会说属性ita_rating key not 已找到或未找到ita_creditlimit,即使我已将其添加到插件注册中的筛选属性中 我已经尝试解决这个问题一天了,但我仍然不知道为什么会发生这些奇怪的行为 因为当我试图禁用其中一个插件时,另一个插件可以工作,有人能给我一些启示吗 这是什么原因?这是我的代码还是别的什么?我已经尝试过使用try-and-catch,这是我得到的一个例外

System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at TrainingConfiguration.Plugins.CreditUpdateValidation.Execute(IServiceProvider serviceProvider) 

我想我已经知道这里出了什么问题,所以要么
Money postValue=(Money)entity.Attributes[“ita_creditlimit”]
var value1=(OptionSetValue)实体属性[“ita_creditrating”]仅当值更改时才具有属性。例如,当我的creditlimit是$500,我只是把它留在那里,不更新我的creditlimit,这时会出现错误,所以我用try and catch修复它,当它出错时,我会在catch上使用PreImage作为我的creditlimit。

这个异常仅在两个插件一起运行时显示,考虑使用
TryGetValue
而不是
[]
。像这样var postRatings=((OptionSetValue)entity.Attributes.TryGetValue(“ita_creditrating”,out);?我应该添加什么第二个参数,它表示out object value?你也为
创建
消息注册了这些插件吗?@jasonscript我使用不同的插件来创建消息,但错误只在更新中显示。
所以我用try-and-catch来修复它
try-catch
非常慢。使用
TryGetValue
.ok所以TryGetValue只是检查实体是否有属性,如果有属性,则使用gett AtAttribute或[],因为起初TryGetValue用于获取属性。我是对的还是错的?错的。它返回值为
out
参数。