Dynamics 365 CRM Upsert含子实体报错:新增产品需单独请求?
关于Dynamics 365 CRM Upsert父实体时子实体的行为说明
这是预期行为,原因如下:
- 对父实体(销售订单)发起Upsert请求时,关联的子实体(销售订单明细)默认被识别为「要更新现有关联记录」,而非新增。如果新增的子实体没有提供有效的主键(或替代键)来匹配订单上已存在的明细记录,系统就会抛出「无法找到现有订单上的该产品」的错误——因为它认为你要更新一条不存在的明细。
正确处理订单行的新增/移除/更新
- 更新现有订单行:在Upsert父实体时,给子实体设置正确的
Id(对应已存在的订单行ID),系统会自动匹配并更新该明细的字段值。 - 新增订单行:需要单独调用
CreateRequest创建销售订单明细,同时关联目标销售订单(设置SalesOrderId为订单的实体引用);如果要在同一个批次请求中处理,可以把Upsert订单和Create明细的请求都加入ExecuteMultipleRequest。 - 移除订单行:必须单独调用
DeleteRequest删除对应的订单行记录,无法通过Upsert父实体自动移除子实体。
修正后的代码示例(新增订单行)
// 假设已有销售订单的ID:existingOrderId var newOrderDetail = new CRMSalesOrderDetail { SalesOrderId = new EntityReference(CRMSalesOrder.EntityLogicalName, existingOrderId), ProductId = new EntityReference("product", targetProductId), Quantity = 2, // 填充其他必填字段(如价格、金额等) }; // 创建订单行请求 var createDetailRequest = new CreateRequest { Target = newOrderDetail }; // 如果需要和订单Upsert一起批量执行 var multipleRequest = new ExecuteMultipleRequest { Settings = new ExecuteMultipleSettings { ReturnResponses = true }, Requests = new OrganizationRequestCollection() }; // 先加入订单Upsert请求(如果需要更新订单) var upsertOrderRequest = new UpsertRequest { Target = existingSalesOrderEntity, // 已填充要更新的订单字段 RequestId = Guid.NewGuid() }; multipleRequest.Requests.Add(upsertOrderRequest); // 再加入新增订单行的请求 multipleRequest.Requests.Add(createDetailRequest); // 执行批量请求 var batchResponse = (ExecuteMultipleResponse)service.Execute(multipleRequest);
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

