您好我试图为ms dynamics crm 2011编写一个插件。该插件从合同行中获取相关记录,然后应该为发票行实体创建记录。如果fetchxml只返回一条记录,则代码运行完美,但是如果它为具有多个合同行的合同循环,则抛出以下错误:
业务流程错误 已添加具有相同密钥的项目
我想我需要为每条记录或其他内容添加一个唯一的ID,请查看下面的代码。
Entity invoiceline = new Entity("invoicedetail");
foreach (Entity contractdetail in contractdetails.Entities)
{
tracingService.Trace("loop no. " + loopint + " " + "InvoiceID: " + stringinvoiceid);
loopint++;
invoiceline["invoiceid"] = new EntityReference("invoice", invoiceid);
//collect data from fetchxml
var title = contractdetail.Attributes["title"];
decimal quantity = Convert.ToDecimal(contractdetail.Attributes["initialquantity"]);
var price = contractdetail.Attributes["price"];
bool booleanover = true;
//add to invoiceline array
invoiceline.Attributes.Add("productdescription", title);
invoiceline.Attributes.Add("quantity", quantity);
invoiceline.Attributes.Add("priceperunit", price);
invoiceline.Attributes.Add("isproductoverridden", booleanover);
//invoiceline.Attributes.Add("invoicedetailid", invoiceid);
//add too database
service.Create(invoiceline);
tracingService.Trace("Created:" + title + " record");
}
答案 0 :(得分:1)
因为您正在使用Attributes.Add
。
属性集合实际上是一个字典,您不能将相同的密钥(productdescription
,quantity
等)添加到字典中两次。
所以你加载的实体记录已经有了这些键(因为你把它包含在columnset
中)
最简单的方法是使用:invoiceline["quanity"] = quantity;
这将覆盖该键的现有值 - 或者如果它不存在,则向字典添加新的键值对。
相关阅读:Dictionary.Add Method。
答案 1 :(得分:0)
试着这样说:
Entity invoiceLine;
foreach (Entity contractDetail in contractDetails.Entities)
{
invoiceline = new Entity("invoicedetail");
...
}