当我尝试删除包含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+ typeplayer。
下面是我的实体代码:
关系主方:
@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[];
}
我试着在谷歌上搜索一个解决方案,有人提到要指定onDelete:OneToMany注解中的“CASCADE”。但当我尝试它时,它仍然报告错误。
然后我尝试将onDelete设置为SET NULL,它仍然报告错误。
然后我尝试使用softDelete删除实体,它工作了。
但是当我试图硬删除实体时,错误又回来了。
然后我尝试删除没有包含关系的实体(即,列是空数组),并且没有报告错误。
我是SQL新手,如何正确删除包含OneToMany关系的实体?
1条答案
按热度按时间h43kikqp1#
好吧,我意识到我非常愚蠢,不得不将
onDelete: "CASCADE"
添加到关系的两边,以便级联正确工作。