AppSync DynamoDB Schema自定义主键后报id字段未定义错误如何解决
核心结论
你的认知没有问题:AppSync + Amplify GraphQL Transformer 原生支持通过@primaryKey指定自定义主键,完全替代框架默认生成的id字段。
报错本质是配置缺失:你没有显式关闭@model自动注入默认id字段的开关,导致框架自动生成的订阅、变更逻辑仍然在引用不存在的默认id字段,触发GraphQL校验错误。
报错原因
@model指令默认开启autoIdField: true配置,会自动完成三个默认行为:
- 给当前类型自动注入
id: ID!字段作为默认主键 - 所有自动生成的CRUD入参、订阅返回逻辑,默认绑定读取
id字段 - 所有关联关系(
@hasOne/@hasMany/@manyToMany)默认使用id作为关联外键
你仅给sessionId添加了@primaryKey标记,但没有修改默认的autoIdField配置,框架不会自动把全局对默认id的引用替换为你的自定义主键,因此自动生成的onCreateSession订阅尝试读取不存在的id字段时,就会抛出你看到的FieldUndefined错误。
修复步骤
- 调整Schema配置,关闭自动id生成,同时显式给关联关系指定外键为你的自定义主键,修正后的类型定义如下:
type Session @model(autoIdField: false) @auth(rules: [{allow: public}, { allow: owner }, { allow: groups, groups: ["Admin"] }]) { sessionId: ID! @primaryKey numPeoplePresent: Int procedures: Procedures @hasOne(references: ["sessionId"]) notes: String cattle: [Cow] @manyToMany(relationName: "CowSessions", references: ["sessionId"]) }
注意:如果关联的
Procedures、Cow类型也使用了自定义主键,需要在对应类型的关联字段上同步配置正确的引用字段,避免后续关联查询报错。
- 推送更新后的Schema到云端,执行命令时添加参数允许Schema结构调整:
amplify push --allow-destructive-graphql-schema-updates
该参数仅用于允许框架删除之前自动生成的冗余id相关配置,不会丢失你已存储的业务数据。
- 云端部署完成后,重新生成客户端侧的模型定义,保证本地代码和云端Schema一致:
amplify codegen models
完成以上步骤后,相关报错就会消失,所有CRUD、订阅、关联逻辑都会正常使用你自定义的sessionId作为主键。
内容的提问来源于stack exchange,提问作者Zipper
相关产品推荐
相关产品推荐

