TypeORM级联:true标志不会删除相关实体

时间:2019-11-05 19:37:44

标签: typescript typeorm

我不知道是我本人,cascade: true选项在删除父实体时不会删除子实体吗?

@Entity()
export class Folder {
  @PrimaryGeneratedColumn()
  public readonly id: number;

  @OneToMany(() => Segment, (segment) => segment.folder, {
    cascade: true,
  })
  public segments: Segment[];
}


@Entity()
export class Segment {
  @PrimaryGeneratedColumn()
  public readonly id: number;

  @ManyToOne(() => Folder, (folder) => folder.segments)
  @JoinColumn()
  public folder: Folder;
}

然后我就

await getRepository(Folder).delete(id);

这给了我一个错误:

update or delete on table "folder" violates foreign key constraint "FK_12606f83d18e5ae0c7e5693f3fb" on table
"segment"

也尝试做

const folder = await this.repository.findOneOrFail(id);
repository.remove(folder)
//or 
folder.segments = null;
await this.repository.save(folder);

仍然错误...

我不想遍历所有子实体并手动删除它们。我认为cascade: true应该处理以及保存或更新。 也许语法应该不同?

谢谢!

2 个答案:

答案 0 :(得分:1)

级联仅描述如何处理相关实体,删除实体本身不会产生任何影响。如果要在删除文件夹时删除所有段,则需要使用 onDelete (这是一项数据库功能,否则需要层叠,这是在TypeORM中实现的。这意味着您需要在以下情况下生成并执行迁移:添加onDelete)。所以这应该为您工作:

@Entity()
export class Segment {
  @PrimaryGeneratedColumn()
  public readonly id: number;

  @ManyToOne(() => Folder, (folder) => folder.segments, { onDelete: 'CASCADE' })
  @JoinColumn()
  public folder: Folder;
}

答案 1 :(得分:1)

这是typeorm代码中的错误,我使用https://www.npmjs.com/package/patch-package修复了此问题,因为我需要尽快修复此问题

您需要使用以下代码修补node_modules/typeorm/persistence/subject-builder/OneToManySubjectBuilder.js上的文件(-是要删除的文件,+是要添加的文件):

             var removedRelatedEntitySubject = new Subject_1.Subject({
                 metadata: relation.inverseEntityMetadata,
                 parentSubject: subject,
-                canBeUpdated: true,
+                canBeUpdated: !relation.isNullable,
+                mustBeRemoved: relation.isNullable,