Búsqueda de sitios web

typescript - La bandera cascade: true de TypeORM no elimina las entidades relacionadas


No puedo averiguar si soy yo, o si la opción cascade: true no elimina las entidades hijas al eliminar la entidad padre.

@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;
}

y luego lo hago

await getRepository(Folder).delete(id);

lo cual me da un error:

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

También intenté hacer

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

todavía error...

No quiero recorrer todas las entidades hijas y eliminarlas manualmente. Pensé que cascade: true debería manejarlo, así como al guardar o actualizar. ¿Quizás la sintaxis debería ser diferente?

¡Gracias!

Respuesta #1

Cascade solo describe qué hacer con las entidades relacionadas, no tiene efecto cuando se elimina la entidad en sí. Si deseas eliminar todos los segmentos al eliminar una carpeta, necesitas usar onDelete (esta es una función de la base de datos, de lo contrario usa cascade, que se implementa dentro de TypeORM. Esto significa que necesitas generar y ejecutar migraciones al agregar onDelete). Así que esto debería funcionar para ti:

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

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

Respuesta #2

Entidad principal => establecer cascade a "eliminar"

// Parent Entity
@OneToMany(type => Comment, comment => comment.parent,{ cascade: ["remove"] })
replies: Comment[];

Entidad Hija => configurar onDelete a CASCADE y orphanedRowAction a eliminar.

// Child Entity
@ManyToOne(type => Comment, comment => comment.replies, {
    onDelete: "CASCADE", orphanedRowAction: 'delete'
})
parent: Comment;

Nota

Cuando quieras eliminar Padre con sus hijos debes hacer lo siguiente:

await ParentRepository.delete(parentId)

Artículos relacionados