2

我正在尝试使用插件创建新产品,但出现此异常:

System.Collections.Generic.KeyNotFoundException:给定的键不在字典中。

这是创建产品的代码

EntityReference ugRef = new EntityReference(ug.LogicalName, ug.UoMScheduleId.Value);
EntityReference uRef = new EntityReference(u.LogicalName, u.UoMId.Value);   
Product product = new Product()
{
  Name = pName,
  ProductNumber = pNumber,
  QuantityDecimal = 2,
  DefaultUoMScheduleId = ugRef,
  DefaultUoMId = uRef
}; 
service.Create(product);

所有变量都经过测试,它们都有值。该单位对于单位组是正确的 - 如果我改变任何一个,我都会得到一个例外。

问题肯定出在这段代码上,因为当代码更改为此时,预期的第一名和姓氏有一个可爱的线索:

EntityReference ugRef = new EntityReference(ug.LogicalName, ug.UoMScheduleId.Value);
EntityReference uRef = new EntityReference(u.LogicalName, u.UoMId.Value);
Lead l = new Lead();
l.FirstName = uRef.Id.ToString();
l.LastName = uRef.LogicalName;
service.Create(l);
/*
  Product product = new Product()
  {
    Name = (String)staged.Attributes["wishlist_name"],
    ProductNumber = (String)staged.Attributes["wishlist_barcode"],
    QuantityDecimal = 2,
    DefaultUoMScheduleId = ugRef,
    DefaultUoMId = uRef
  }; 
  service.Create(product);
*/

pNamepNumber是字符串。
uug是一个Unit和一个Unit Group

我将代码更改为:

            query = new QueryByAttribute("uom");
            query.ColumnSet = new ColumnSet("name", "uomscheduleid");
            query.Attributes.AddRange("name");
            query.Values.AddRange("1");
            UoM unit = (UoM)service.RetrieveMultiple(query).Entities[0];                    
            Product newProduct = new Product
            {

                ProductNumber = "1t2y3u",
                Name = "Example Banana Product",
                QuantityDecimal = 1,
                DefaultUoMScheduleId = unit.UoMScheduleId,
                DefaultUoMId = unit.ToEntityReference()
            };
            service.Create(newProduct);

抛出相同的错误。

我要用这个剥夺我的摩尔了。

4

1 回答 1

2

有几件事要看。

  1. 看起来您在第一个示例中尝试简化代码,但可能已经删除了错误的来源,但幸运的是,您将其添加到了上一个示例中:) 我猜 staged 不包含"wishlist_name",因此给了你你看到的错误。您应该始终使用GetAttributeValueEntity 类中定义的类型化方法:staged.GetAttributeValue<String>("wishlist_name"). 它将执行空检查并返回该类型的默认值。

  2. 检查所有其他插件,以查看是否在创建产品时触发了另一个插件,如果填充了 DefaultUoMScheduleId 或 DefaultUoMId,这可能会执行一些额外的逻辑。您在此插件中的创建可能会从另一个“嵌套”插件中收到错误。

  3. 无需创建临时实体引用变量,而是使用实体类中定义的 ToEntityReference() 方法,恕我直言,它使代码看起来更简洁一些。

        Product product = new Product()
        {
            Name = (String)staged.Attributes["wishlist_name"],
            ProductNumber = (String)staged.Attributes["wishlist_barcode"],
            QuantityDecimal = 2,
            DefaultUoMScheduleId = ug.ToEntityReference(),
            DefaultUoMId = u.ToEntityReference()
    
        }; 
    
于 2013-01-28T14:57:17.113 回答