TypeORM是否支持自动级联删除?

时间:2020-10-28 23:09:36

标签: nestjs one-to-many typeorm

这不是一个特定的编码问题,更多的是一般性问题。我在文档中找不到一种或另一种答案。

假设我们有一个名为 Invoice 的实体,其中包含许多 LineItem 实体,我使用ManyToOne()OneToMany()作为文档描述。另外,我们确保在cascade: true装饰器选项中包含OneToMany()

现在,让我们创建一个包含2个LineItems的Invoice对象。如果我保存此发票,TypeORM会正确地级联并将其自动保存到数据库中-一切正常。我只需要一行代码即可将3行保存到数据库中。

现在,让我们假设我从数组中删除了这些LineItem之一,然后重新保存了发票。在这种情况下,TypeORM会引发类似以下的错误:

QueryFailedError: ER_BAD_NULL_ERROR: Column 'invoice_line_item_id' cannot be null

这个错误对我很清楚:我假设TypeORM理解此LineItem不再与发票相关联,而是代替删除LineItem(这是我希望TypeORM要做的事情),而是尝试更新行并将外键invoice_line_item_id设置为null。自然,此外键不可为空,因此mysql会抱怨。

如何告诉TypeORM删除此行?我是否必须使用repository.remove()手动删除子级?我需要删除isNullable: false吗? (不理想)

谢谢!

1 个答案:

答案 0 :(得分:0)

来自TypeORM中的RelationOptions.d.ts

  • 设置给定关系的级联选项。
  • 如果设置为true,则意味着可以在数据库中插入或更新相关对象。

因此,我相信您可以为装饰器添加一个附加选项,例如onDelete: 'CASCADE',这样可以解决您的问题。例如:

@ManyToOne(data => data, { cascade: true, onDelete: 'CASCADE' })