【问题标题】:Cannot delete a OneToMany record in TypeORM无法删除 TypeORM 中的 OneToMany 记录
【发布时间】:2020-10-25 17:53:44
【问题描述】:

我有以下架构

@Entity()
export class Question extends BaseEntity {
  @PrimaryColumn()
  messageId: string;

  @Column()
  authorId: string;

  @Column()
  question: string;

  @Column("varchar", { array: true })
  possibleAnswers: string[];

  @Column()
  isAnonymous: boolean;

  @OneToMany(() => Answer, (answer) => answer.question, { eager: true })
  answers: Answer[];

  get formattedAnswers() {
    return this.possibleAnswers
      .map((answer, idx) => `${numericEmojis[idx]}: **${answer}**`)
      .join("\n");
  }
}

@Entity()
@Unique("uc_ids", ["userId", "questionMessageId"])
export class Answer extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  userId: string;

  @Column()
  answerIndex: number;

  @ManyToOne(() => Question, (question) => question.answers)
  question: Question;

  @Column({ readonly: true })
  // @ts-expect-error
  private readonly questionMessageId: string;
}

每当我尝试删除喜欢时

const question = await Question.findOne(message.id);

await Question.delete(question);

我收到以下错误:

err: query: SELECT "Question"."message_id" AS "Question_message_id", "Question"."author_id" AS "Question_author_id", "Question"."question" AS "Question_question", "Question"."possible_answers" AS "Question_possible_answers", "Question"."is_anonymous" AS "Question_is_anonymous", "Question__answers"."id" AS "Question__answers_id", "Question__answers"."user_id" AS "Question__answers_user_id", "Question__answers"."answer_index" AS "Question__answers_answer_index", "Question__answers"."question_message_id" AS "Question__answers_question_message_id" FROM "question" "Question" LEFT JOIN "answer" "Question__answers" ON "Question__answers"."question_message_id"="Question"."message_id" WHERE "Question"."message_id" IN ($1) -- PARAMETERS: ["729340583583285289"]
err: (node:19515) UnhandledPromiseRejectionWarning: EntityColumnNotFound: No entity column "answers" was found.

最初我试图设置级联删除,这样当我删除一个问题时,答案也会被删除,我得到了同样的错误,但即使在删除级联删除后我得到了同样的错误,我该如何解决这个问题?我正在使用带有 SnakeNamingStrategy 的 Postgres 数据库

【问题讨论】:

  • 尝试启用日志记录(参见this)。
  • 尝试在 Answer 的 question 字段中添加 onDelete: "CASCADE"。见this
  • 我在@CarloCorradini 之前遇到过这个问题,我遇到了和现在一样的问题,最后一个 sn-p 是在尝试删除之前发生的日志
  • 尝试 await Question.delete(question.messageId);
  • 谢谢,这似乎有效

标签: postgresql typescript typeorm


【解决方案1】:

通过添加 onDelete:"CASCADE" 或 onDelete:"SET NULL" 为我工作。

I have the following schemas

@Entity()
export class Question extends BaseEntity {
  @PrimaryColumn()
  messageId: string;

  @Column()
  authorId: string;

  @Column()
  question: string;

  @Column("varchar", { array: true })
  possibleAnswers: string[];

  @Column()
  isAnonymous: boolean;

  @OneToMany(() => Answer, (answer) => answer.question, { eager: true })
  answers: Answer[];

  get formattedAnswers() {
    return this.possibleAnswers
      .map((answer, idx) => `${numericEmojis[idx]}: **${answer}**`)
      .join("\n");
  }
}

@Entity()
@Unique("uc_ids", ["userId", "questionMessageId"])
export class Answer extends BaseEntity {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  userId: string;

  @Column()
  answerIndex: number;
  
  // set onDelete as cascade for automatically delete from parent entity
  @ManyToOne(() => Question, (question) => question.answers, { cascade: true, onDelete: "CASCADE" })
  question: Question;

  @Column({ readonly: true })
  // @ts-expect-error
  private readonly questionMessageId: string;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-04
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 2016-06-21
    • 2013-06-07
    相关资源
    最近更新 更多