Logic Apps中Dataverse更新行时无法通过条件表达式将查找字段设为null的问题
我最近在Logic Apps里用Dataverse的update a row (preview)连接器时碰到个头疼的问题——想把Account表的primarycontactid这个查找字段设为null,结果踩了好几个坑,跟你分享下我的情况和解决办法:
问题场景还原
用create a row (preview)的时候,不管是把primarycontactid留空还是设null都能正常创建行,但更新的时候完全不一样:
- 我一开始在请求体里写空字符串:
"body": { "name": "Test2", "primarycontactid@odata.bind": "" }
直接触发了错误:
{
"error": {
"code": "0x80060888",
"message": "The supplied reference link -- -- is invalid. Expecting a reference link of the form /entityset(key)."
}
}
- 后来我直接把
primarycontactid@odata.bind设为null,居然成功了,但我需要用条件表达式动态判断——比如当Get_Contact返回空结果时设为null,否则绑定对应联系人ID,表达式是这样的:
"primarycontactid@odata.bind": "@{if(empty(body('Get_Contact')?['value']),null,concat('contacts(',body('Get_Contact')?['value']?[0]?['contactid'] ,')'))}"
结果这个表达式在创建行时正常,但更新时完全没用,我试过填空字符串、无效的联系人ID(比如contacts(00000000-0000-0000-0000-000000000000))都不行。
问题根源
其实问题出在Logic Apps对表达式返回null的处理上:当表达式返回null时,更新行的请求体里会自动忽略这个字段,而Dataverse的更新接口不会把缺失的字段默认设为null,只会更新你明确传入的字段。
解决办法
我们需要明确构造包含null值的JSON请求体,确保这个字段不会被忽略,有两种简单的实现方式:
方式1:用「Create JSON Object」动作中转
先添加一个「Create JSON Object」动作,在里面配置:
name:Test2primarycontactid@odata.bind:@{if(empty(body('Get_Contact')?['value']), null, concat('contacts(', body('Get_Contact')?['value']?[0]?['contactid'], ')'))}
然后把更新行动作的Body设置为这个JSON对象的输出,这样就能确保当条件满足时,primarycontactid@odata.bind会被明确设为null。
方式2:用json()函数直接构造请求体
直接在更新行的Body里写以下表达式,通过字符串拼接生成合法的JSON:
@{json(concat('{"name": "Test2", "primarycontactid@odata.bind": ', if(empty(body('Get_Contact')?['value']), 'null', concat('"', concat('contacts(',body('Get_Contact')?['value']?[0]?['contactid'] ,')'), '"')), '}'))}
这种方式不用额外动作,直接通过字符串拼接把null值明确写入JSON结构里,让Dataverse能识别到要清空这个查找字段。
总结
核心就是更新行时,不能依赖表达式返回null来让字段被设为空,必须明确构造包含null值的请求体,才能让Dataverse正确执行清空查找字段的操作。
备注:内容来源于stack exchange,提问作者Moi1880

