使用Sequelize和NestJs实现多对一关联时报外键缺失问题咨询
问题根源
你是把Sequelize的关联装饰器的使用逻辑搞反了,你的多对一外键认知完全正确:外键CATEGORY_ID本来就应该存放在Book表中,不需要在Category表新增任何外键字段,报错完全是装饰器误用导致的。
你之前的代码的装饰器逻辑会被框架解析为:
- Book通过
@HasOne(() => Category)声明:外键存放在关联表Category中 - Category通过
@BelongsTo(() => Book)声明:外键存放在当前表Category中
两者结合就会让框架认为需要在Category表存储Book的外键,自然抛出你遇到的错误。
修复方案
1. 修改book.model.ts
把Book侧的@HasOne替换为@BelongsTo:
@Table({tableName: 'BOOK'}) export class Book extends BaseModel<Book> { ... some fields @ForeignKey(() => Category) @Column({field: 'CATEGORY_ID'}) categoryId: number // Category ID stored in my Database // 替换@HasOne为@BelongsTo:Book属于某个Category,外键存在当前Book表 @BelongsTo(() => Category) category: Category }
2. 修改category.model.ts
把Category侧的@BelongsTo替换为@HasMany:
@Table({tableName: 'CATEGORY'}) export class Category extends BaseModel<Category> { @Column({field: 'NAME'}) name: string // 替换@BelongsTo为@HasMany:一个Category对应多个Book,无需新增字段 @HasMany(() => Book) books: Book[] }
内容的提问来源于stack exchange,提问作者MA-Moustache
相关产品推荐
相关产品推荐

