当我尝试删除包含 OneToMany 关系的实体时,我在控制台上收到错误消息:
query failed: DELETE FROM "task_group_entity" WHERE "id" = ? -- PARAMETERS: ["63361153-83cc-49b8-ba12-19f54e0519a2"]
error: Error: Run: RunSQL: run: FOREIGN KEY constraint failed
我正在使用capacitor-sqlite+typeorm。
这是我的实体代码:
关系所有者方:
@Entity()
export class TaskGroupEntity {
@PrimaryGeneratedColumn("uuid")
id: string;
@Column('datetime', { nullable: true })
dayTaskDate: Date | null;
@Column('text', { nullable: true })
name: string | null;
@Column('text', { nullable: true })
description: string | null;
@OneToMany(() => TaskEntity, task => task.taskGroup, { nullable: true, cascade: true, onDelete: "CASCADE" })
tasks: (TaskEntity | null)[];
@Column('text', { nullable: true })
color: string | null;
@Column('text', { nullable: true })
icon: string | null;
// Already added cascade: true on the other side of the relationship, this column doesn't seem to have anything to do with the problem
@ManyToMany(() => TagEntity, tag => tag.taskGroups, { nullable: true, onDelete: "CASCADE" })
@JoinTable()
tags: (TagEntity | null)[];
@CreateDateColumn()
createDate: Date;
@DeleteDateColumn()
deleteDate: Date;
@Column('datetime', { nullable: true })
deadLineDate: Date | null;
@Column('text')
repeatMode: RepeatMode;
@Column('simple-json', { nullable: true })
repeatCustom: RepeatCustom | null;
}
关系的另一面:
@Entity()
export class TaskEntity {
@PrimaryGeneratedColumn("uuid")
id: string;
// ...
@ManyToOne(() => TaskGroupEntity, taskGroup => taskGroup.tasks, { nullable: true })
taskGroup: TaskGroupEntity | null;
@ManyToOne(() => TaskEntity, task => task.childTasks, { nullable: true })
parentTask: TaskEntity | null;
@OneToMany(() => TaskEntity, task => task.parentTask, { nullable: true })
childTasks: TaskEntity[] | null[];
}
我尝试在 Google 中搜索解决方案,有人提到在 OneToMany 注释中指定 onDelete: "CASCADE" 。但是我尝试的时候还是报错。
然后我尝试将onDelete设置为SET NULL,仍然报错。
然后我尝试使用 softDelete 删除该实体,它成功了。
但是当我尝试硬删除该实体时,错误又回来了。
然后我尝试删除没有包含关系的实体(即该列是空数组),没有报错。
我是 SQL 新手,如何正确删除包含 OneToMany 关系的实体?
好吧,我意识到我很愚蠢,必须在关系的两侧添加
onDelete: "CASCADE"
才能使级联正常工作。