Dynamics CRM业务流程错误已添加具有相同密钥的项目

时间:2013-03-05 13:22:31

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

您好我试图为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");
}

2 个答案:

答案 0 :(得分:1)

因为您正在使用Attributes.Add

属性集合实际上是一个字典,您不能将相同的密钥(productdescriptionquantity等)添加到字典中两次。

所以你加载的实体记录已经有了这些键(因为你把它包含在columnset中)

最简单的方法是使用:invoiceline["quanity"] = quantity;

这将覆盖该键的现有值 - 或者如果它不存在,则向字典添加新的键值对。

相关阅读:Dictionary.Add Method

答案 1 :(得分:0)

试着这样说:

Entity invoiceLine;
foreach (Entity contractDetail in contractDetails.Entities)
{
    invoiceline = new Entity("invoicedetail");
    ...
}