我正在尝试使用插件创建一个新产品,但我得到了这个例外:
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);
抛出同样的错误。
我即将剥夺这个问题。
答案 0 :(得分:2)
要看一些事情。
看起来你试图在第一个例子中简化你的代码,但可能已经删除了你的bug的来源,但幸运的是,你把它添加到你的最后一个例子:)我猜测上演不包含"wishlist_name"
,因此给出了您看到的错误。您应始终使用实体类中定义的类型GetAttributeValue
方法:staged.GetAttributeValue<String>("wishlist_name")
。它将执行空检查并返回类型的默认值。
检查所有其他插件,看看是否在创建产品时触发了另一个插件,如果填充了DefaultUoMScheduleId或DefaultUoMId,则可能会执行一些额外的逻辑操作。您在此插件中的创建可能会从另一个“嵌套”插件中获取错误。
不使用创建临时实体引用变量,而是使用实体类中定义的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()
};