CRM 2011创建产品插件

时间:2013-01-28 13:41:47

标签: c# dynamics-crm-2011 dynamics-crm

我正在尝试使用插件创建一个新产品,但我得到了这个例外:

  

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);
*/

pName pNumber 是字符串 u ug 单元单元组

我将代码更改为:

            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);

抛出同样的错误。

我即将剥夺这个问题。

1 个答案:

答案 0 :(得分:2)

要看一些事情。

  1. 看起来你试图在第一个例子中简化你的代码,但可能已经删除了你的bug的来源,但幸运的是,你把它添加到你的最后一个例子:)我猜测上演不包含"wishlist_name",因此给出了您看到的错误。您应始终使用实体类中定义的类型GetAttributeValue方法: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()
    
        };