尝试删除包含 OneToMany 关系的实体时出现错误“FOREIGN KEY 约束失败”

问题描述 投票:0回答:1

当我尝试删除包含 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 关系的实体?

database sqlite typeorm capacitor
1个回答
1
投票

好吧,我意识到我很愚蠢,必须在关系的两侧添加

onDelete: "CASCADE"
才能使级联正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.