使用Amplify DataStore更新多对多关系出现ConditionalCheckFailedException报错
Amplify Datastore 多对多关联更新实现及报错解决方案
ConditionalCheckFailedException 报错原因
Amplify 自动生成的多对多关联表(如ProfileProfession)默认采用乐观锁机制,删除操作默认会校验记录的_version字段值是否与服务端一致。删除操作触发报错的核心原因是删除时仅传入了profileId、professionId两个外键字段,未传入关联记录自身的主键id以及_version两个系统必填字段,导致DynamoDB条件校验不通过。
多对多关系更新的正确实现逻辑
修改Profile关联职业信息的操作按照以下顺序执行即可:
- 第一步:先查询当前Profile对应的所有旧
ProfileProfession关联记录,查询时会返回每条记录的完整字段,包含系统自动生成的id、_version字段 - 第二步:将查询到的旧关联记录逐条传入删除接口,不要自行构造删除参数,直接使用查询返回的完整记录对象即可
- 第三步:按照原有逻辑新增新的
ProfileProfession关联记录
核心代码示例
import { DataStore } from 'aws-amplify'; import { ProfileProfession } from './models'; /** * 更新Profile关联的职业信息 * @param {string} profileId 当前用户关联的Profile ID * @param {Array<string>} newProfessionIds 新选中的职业ID列表 */ async function updateProfileProfessions(profileId, newProfessionIds) { // 查询所有旧关联记录 const oldRelations = await DataStore.query(ProfileProfession, (c) => c.profileId.eq(profileId)); // 批量删除旧关联 for (const relation of oldRelations) { await DataStore.delete(relation); } // 批量新增新关联 for (const professionId of newProfessionIds) { await DataStore.save( new ProfileProfession({ profileId, professionId }) ); } }
额外注意事项
- 批量操作如果数据量较大时,建议添加异常捕获和重试逻辑,避免网络波动导致的操作失败
- 不要手动修改关联表记录的
id、_version等系统字段,所有操作均使用Datastore查询返回的原始字段值即可
内容的提问来源于stack exchange,提问作者Alexis Duran
相关产品推荐
相关产品推荐

