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
相关产品推荐
相关产品推荐

