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

Dynamics 365 v9.1如何通过单个PATCH请求清空lookup实现事务性更新

Dynamics 365 v9.1 Web API 单事务更新字段并清空Lookup实现方案

不需要新增特殊请求头,之前的报错源于Lookup字段清空的写法错误。

核心规则

  • 字段名@odata.bind 属性仅用于绑定已有关联记录,不支持传空路径、null值来实现清空效果,传值不符合规范时会直接返回400 Bad Request
  • 要在单个PATCH请求中清空Lookup字段,直接给Lookup字段本身(不带@odata.bind后缀)赋值null即可,所有操作在单个请求内执行,天然满足单事务要求,任意环节出错所有变更自动回滚,不会出现部分生效的情况。

正确代码示例

场景1:更新contact记录文本、布尔字段同时清空Lookup

var entity = {};
// 普通类型字段更新逻辑保持原有写法即可
entity.new_appeal = "Updated text";
entity.new_is_qualified = true;
// 清空Lookup直接给字段名赋值null,不要加@odata.bind后缀
entity.new_operator_du_id = null;

var req = new XMLHttpRequest();
req.open("PATCH", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/contacts(03db3c0a-27e3-ec11-998d-005056918c2c)", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204) {
            // 操作成功后业务逻辑
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send(JSON.stringify(entity));

场景2:清空account记录的parentaccountid查找字段

var entity = {};
// 错误写法:entity["parentaccountid@odata.bind"] = null;
// 正确写法
entity.parentaccountid = null;

var req = new XMLHttpRequest();
req.open("PATCH", Xrm.Page.context.getClientUrl() + "/api/data/v9.1/accounts(32ac43be-24e6-ec11-998d-005056918c2c)", true);
req.setRequestHeader("OData-MaxVersion", "4.0");
req.setRequestHeader("OData-Version", "4.0");
req.setRequestHeader("Accept", "application/json");
req.setRequestHeader("Content-Type", "application/json; charset=utf-8");
req.onreadystatechange = function() {
    if (this.readyState === 4) {
        req.onreadystatechange = null;
        if (this.status === 204) {
            // 操作成功后业务逻辑
        } else {
            Xrm.Utility.alertDialog(this.statusText);
        }
    }
};
req.send(JSON.stringify(entity));

补充说明

  • 该写法符合OData 4.0标准协议,在Dynamics 365 v9.x全版本支持,无需安装额外工具、解决方案,现有CRM REST Builder生成的基础更新请求只需调整Lookup字段赋值逻辑即可正常使用
  • 后续如果需要给Lookup字段绑定关联记录,仍然沿用字段名@odata.bind = "/实体集名(记录ID)"的标准写法,仅清空操作使用直接给字段赋值null的方式。

内容的提问来源于stack exchange,提问作者Andrey Bushman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:57:45