0

您好,我正在尝试为 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");
}
4

2 回答 2

1

这是因为您正在使用Attributes.Add.

属性集合实际上是一个字典,你不能将同一个键(productdescription,quantity等)添加到字典中两次。

因此,您已加载的实体记录已经具有这些键(因为您将其包含在 中columnset

避免这种情况的最简单方法就是使用:invoiceline["quanity"] = quantity;

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

相关阅读:Dictionary.Add 方法

于 2013-03-05T14:06:44.493 回答
0

试着这样写:

Entity invoiceLine;
foreach (Entity contractDetail in contractDetails.Entities)
{
    invoiceline = new Entity("invoicedetail");
    ...
}
于 2013-03-05T14:11:43.737 回答