如何在 TypeORM 上使用 onDelete: 'CASCADE'

aRt*_*too 1 typeorm typeorm-activerecord

我有 2 个迁移用户和帖子,并且帖子有一个onDelete: 'CASCADE'. 由于某种原因,当我删除带有帖子的用户时,它会抛出错误:

"Cannot delete or update a parent row: a foreign key constraint fails (`development_db`.`posts`, CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`))",
Run Code Online (Sandbox Code Playgroud)

但我已经将我的 Posts 实体设置为onDelete: 'CASCADE'. 让我失望的是,当我ON DELETE CASCADE在帖子迁移上添加时,级联删除仍然有效,即使我onDelete: 'CASCADE'在帖子模型上删除了。任何想法?onDelete那么,当您可以在迁移上而不是在实体上设置它但仍然有效时,在 typeorm 中有什么用呢?

用户迁移:

"Cannot delete or update a parent row: a foreign key constraint fails (`development_db`.`posts`, CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `users` (`id`))",
Run Code Online (Sandbox Code Playgroud)

后迁移:

/* eslint-disable class-methods-use-this */
import { MigrationInterface, QueryRunner } from 'typeorm';

export class UsersTable1575433829516 implements MigrationInterface {
  public async up(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.query(`
            CREATE TABLE users (
              id INT AUTO_INCREMENT,
              username VARCHAR(50) NOT NULL,
              email VARCHAR(50) NOT NULL UNIQUE,
              password VARCHAR(255) NOT NULL,
              createdAt DATETIME NOT NULL,
              PRIMARY KEY(id)
            );
        `);
  }

  public async down(queryRunner: QueryRunner): Promise<any> {
    await queryRunner.dropTable('users', true);
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 10

我遇到了同样的错误消息 ( "Cannot delete or update a parent row: a foreign key constraint fails"),因为我已将 放入装饰器onDelete: 'CASCADE'@OneToMany,而不是@ManyToOne装饰器中,而它需要放置在装饰器中才能正确生成迁移。

这是对我不起作用的:

@Entity()
export class User {

    //...

    @OneToMany(() => Post, (post) => post.user, { onDelete: 'CASCADE' })
    public posts: Post[];

    //...

}
Run Code Online (Sandbox Code Playgroud)

这对我有用:

@Entity()
export class Post {

    // ...

    @ManyToOne(() => User, (user) => user.posts, { onDelete: 'CASCADE' })
    public user: User;

    // ...

}
Run Code Online (Sandbox Code Playgroud)

我猜这就是问题所在,因为根据您的评论之一,听起来您来自 Rails 世界。在 Rails 中,您可以在“一”侧指定“级联删除”( has_many :posts, dependent: :destroy)。相比之下,TypeORM 似乎在“Many”方面需要它。