【问题标题】:Does TypeORM support automatically cascade deletion?TypeORM 是否支持自动级联删除?
【发布时间】:2020-10-29 14:42:55
【问题描述】:

这不是一个特定的编码问题 - 更多的是一般性问题。我在文档中找不到单方面的答案。

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

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

现在,假设我从数组中删除其中一个 LineItem 并重新保存 Invoice。在这种情况下,TypeORM 会抛出如下所示的错误:

QueryFailedError: ER_BAD_NULL_ERROR: Column 'invoice_line_item_id' cannot be null

这个错误对我来说很清楚:我假设 TypeORM 理解这个 LineItem 不再与 Invoice 关联,但不是删除 LineItem(这是我希望 TypeORM 做的),而是尝试更新行并将外键 invoice_line_item_id 设置为 null。自然,这个外键是不能为空的,所以mysql会报错。

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

谢谢!

【问题讨论】:

    标签: nestjs one-to-many typeorm


    【解决方案1】:

    来自 TypeORM 中的RelationOptions.d.ts

    • 为给定关系设置级联选项。
    • 如果设置为 true,则表示允许在数据库中插入或更新相关对象。

    所以,我相信您可以为您的装饰器添加一个额外的选项,例如 onDelete: 'CASCADE',它会解决您的问题。例如:

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

    【讨论】:

    • 不幸的是,这是我尝试的第一件事——它似乎并没有做任何事情,因为出现了同样的错误消息。实际上有一个 github 修复了这个问题,但它仍在等待他们的一位团队成员的审查:(github.com/typeorm/typeorm/pull/6704我真的希望他们能解决这个问题。考虑到有多深,在几十个地方手动编写这个删除代码会很痛苦这些删除决定在我的实体图中
    猜你喜欢
    • 2014-07-26
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2021-09-23
    相关资源
    最近更新 更多