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”方面需要它。
| 归档时间: |
|
| 查看次数: |
9478 次 |
| 最近记录: |