这不是一个特定的编码问题,更多的是一般性问题。我在文档中找不到一种或另一种答案。
假设我们有一个名为 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
吗? (不理想)
谢谢!
答案 0 :(得分:0)
来自TypeORM中的RelationOptions.d.ts
:
- 设置给定关系的级联选项。
- 如果设置为true,则意味着可以在数据库中插入或更新相关对象。
因此,我相信您可以为装饰器添加一个附加选项,例如onDelete: 'CASCADE'
,这样可以解决您的问题。例如:
@ManyToOne(data => data, { cascade: true, onDelete: 'CASCADE' })