使用级联删除Typeorm中的many2many实体

时间:2020-09-02 08:37:17

标签: node.js nestjs typeorm

我有一个名为Entry的实体,它与另一个称为Image的实体Many2Many有关。

EntryImage关系如下所示:

@Entity('entry')
export class EntryEntity extends BaseEntity implements IDeserializable<EntryEntity> {
    @ManyToMany(type => ImageEntity, image => image.entries, { onDelete: 'CASCADE', cascade: true })
    @JoinTable()
    images: ImageEntity[];
}

Image实体类:

@Entity('image')
export class ImageEntity extends BaseEntity implements IDeserializable<ImageEntity> {
    @ManyToMany(type => EntryEntity, entry => entry.images)
    entries: EntryEntity[];
}

我用于删除条目的方法:

    public async delete(entryId: number): Promise<void> {
      const queryRunner = this.connection.createQueryRunner();
      await queryRunner.connect();
      await queryRunner.startTransaction();
      try {
        await queryRunner.manager.getRepository(EntryEntity)
                                 .createQueryBuilder('entry')
                                 .delete()
                                 .from(EntryEntity)
                                 .where('entry.id = :entryId', { entryId })
                                 .execute();
        await queryRunner.commitTransaction();
      } catch (err) {
        await queryRunner.rollbackTransaction();
      } finally {
        await queryRunner.release();
      }
    }

预期行为:

如果我删除了某些条目,则其所有图像也应该删除。

实际行为:

条目从其表中删除,它也从entry_images_image表中删除 但是与此条目关联的图像仍然存在(它们仍然存在于image表中)。

我对TypeOrm不太熟悉,为什么会发生?我非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

级联所做的是删除双方的关系,而不是实体本身。因此,在您的情况下,您只会收到没有关系的图像,就像您提到的那样。

这样看:假设您有多个图像用于多个条目,并且它们彼此相连。如果删除一项,您是否真的希望图像实体被完全删除?因为在这种情况下,您将删除大量尚未删除的数据。