TypeORM级联:true标志不删除相关实体

Dmi*_*nin 8 typescript typeorm

我无法弄清楚是否是我,cascade: true在删除父实体时是否选择不删除子实体?

@Entity()
export class Folder {
  @PrimaryGeneratedColumn()
  public readonly id: number;

  @OneToMany(() => Segment, (segment) => segment.folder, {
    cascade: true,
  })
  public segments: Segment[];
}


@Entity()
export class Segment {
  @PrimaryGeneratedColumn()
  public readonly id: number;

  @ManyToOne(() => Folder, (folder) => folder.segments)
  @JoinColumn()
  public folder: Folder;
}

Run Code Online (Sandbox Code Playgroud)

然后我就这么做了

await getRepository(Folder).delete(id);
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

update or delete on table "folder" violates foreign key constraint "FK_12606f83d18e5ae0c7e5693f3fb" on table
"segment"
Run Code Online (Sandbox Code Playgroud)

也尝试过做

const folder = await this.repository.findOneOrFail(id);
repository.remove(folder)
//or 
folder.segments = null;
await this.repository.save(folder);
Run Code Online (Sandbox Code Playgroud)

还是报错...

我不想循环遍历所有子实体并手动删除它们。我认为cascade: true应该在保存或更新的同时处理它。也许语法应该不同?

谢谢!

Jud*_*dge 12

级联仅描述如何处理相关实体,当实体本身被删​​除时它没有效果。如果要在删除文件夹时删除所有段,则需要使用onDelete(这是数据库功能,否则则级联,这是在TypeORM内实现的。这意味着添加onDelete时需要生成并执行迁移)。所以这应该适合你:

@Entity()
export class Segment {
  @PrimaryGeneratedColumn()
  public readonly id: number;

  @ManyToOne(() => Folder, (folder) => folder.segments, { onDelete: 'CASCADE' })
  @JoinColumn()
  public folder: Folder;
}
Run Code Online (Sandbox Code Playgroud)