You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:33:30