Dynamics365 FO中OData通过filter筛选单实体实现更新删除操作问题
针对Dynamics 365 Finance and Operations SecurityUserRoles实体OData操作问题的解决方案
核心原因说明
Dynamics 365 FO的OData服务不支持在PATCH、DELETE等修改类请求的URL中携带$filter参数匹配资源,无论$filter实际匹配到多少条记录,服务端都会出于数据安全校验直接返回「找到多个资源」的报错。GET请求携带$filter默认返回的就是数组格式,OData标准没有通过$filter直接返回单实体对象的语法。
可行解决方案
方案1:使用组合键直接寻址单实体(推荐)
SecurityUserRoles实体采用组合主键,不需要单独的单字段映射ID,你可以直接将所有主键字段放入请求地址中实现单实体寻址,格式如下:
/data/SecurityUserRoles(UserId='UserIDValue',SecurityRoleIdentifier='11111111-1111-1111-1111-C3C8BC7DB911',Partition='你的分区值',LegalEntityId='所属公司ID')
- 若分配的是全局安全角色,
LegalEntityId传入空字符串即可 Partition字段值可以先通过一次GET查询对应记录获取,同一环境的分区值通常固定
你直接对上述地址发起PATCH、DELETE请求即可正常操作单条记录,不会触发匹配错误。
方案2:通过系统内置RecId字段寻址
Dynamics 365 FO所有实体都内置了全局唯一的RecId字段作为隐藏主键,你可以先通过GET查询获取目标记录的RecId,再用标准单实体格式操作:
- 发起GET查询获取RecId:
/data/SecurityUserRoles?$filter=UserId eq 'UserIDValue' and SecurityRoleIdentifier eq '11111111-1111-1111-1111-C3C8BC7DB911'&$top=1&$select=RecId - 用获取到的RecId构造操作地址:
/data/SecurityUserRoles(RecId='查询得到的RecId数值')
对上述地址发起PATCH、DELETE请求即可正常执行。
内容的提问来源于stack exchange,提问作者Oleksii
相关产品推荐
相关产品推荐

