TypeORM不保存关系

7 typeorm

我有以下要保存的实体:

@Entity('approvals')
export class Approval {
  @PrimaryGeneratedColumn()
  id: string;

  @ManyToOne(type => Task, task => task.approvals, {nullable: false, onDelete: 'CASCADE', lazy: true})
  task: Promise<Task> | Task;

  @ManyToOne(type => User, user => user.approvals, {nullable: false, onDelete: 'CASCADE', lazy: true})
  user: Promise<User> | User;

  @Column({ type: 'enum', enum: ApprovalState, default: ApprovalState.None })
  state: ApprovalState;

  constructor(partialApproval: Partial<Approval>) {
    Object.assign(this, partialApproval);
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我想保存一个看起来像(调试时复制)的实体:

[
  {
    "task": {
      "id": "2",
      "name": "task1",
      "type": "type1",
      "neededTimeSeconds": 0,
      "factor": 1,
      "userId": "1",
      "periodStart": "2019-01-01",
      "periodEnd": "2019-01-31",
      "done": true,
      "__user__": {
        "id": "1",
        "username": "user1",
        "password": "$2b$10$SBPIVm9p8L4YkpiUVJ.mpedIgWi5Je6MuWTM7IvgMdyhr27JYM0OG",
        "credits": 0,
        "gravatarHash": null
      },
      "__has_user__": true
    },
    "user": {
      "id": "2",
      "username": "shouldHaveApprovalUser1",
      "password": "password1",
      "credits": 0,
      "gravatarHash": null
    }
  },
  {
    "task": {
      "id": "2",
      "name": "task1",
      "type": "type1",
      "neededTimeSeconds": 0,
      "factor": 1,
      "userId": "1",
      "periodStart": "2019-01-01",
      "periodEnd": "2019-01-31",
      "done": true,
      "__user__": {
        "id": "1",
        "username": "user1",
        "password": "$2b$10$SBPIVm9p8L4YkpiUVJ.mpedIgWi5Je6MuWTM7IvgMdyhr27JYM0OG",
        "credits": 0,
        "gravatarHash": null
      },
      "__has_user__": true
    },
    "user": {
      "id": "3",
      "username": "shouldHaveApprovalUser2",
      "password": "password1",
      "credits": 0,
      "gravatarHash": null
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

然后repository.save()用上面的数组调用,我得到:

null value in column "taskId" violates not-null constraint
Run Code Online (Sandbox Code Playgroud)

虽然id每个都有明确的定义task

这是Task实体类:

@Entity('tasks')
export class Task {
  @PrimaryGeneratedColumn({ type: 'bigint' })
  id: string;

  @Column({ length: 30 })
  name: string;

  @Column({ default: 'help' })
  type: string;

  @Column({ name: 'needed_time', type: 'int', nullable: true })
  neededTimeSeconds: number;

  @Column({ type: 'int', default: 1 })
  factor: number;

  @ManyToOne(type => User, { nullable: true, lazy: true })
  @JoinColumn({ name: 'user_id' })
  user: Promise<User>;

  @Column({ name: 'user_id' })
  @RelationId((task: Task) => task.user)
  userId: string;

  @Column({ name: 'period_start', type: 'date', default: new Date() })
  periodStart: string;

  @Column({ name: 'period_end', type: 'date', default: new Date() })
  periodEnd: string;

  @Column({ type: 'boolean', default: false })
  done: boolean;

  @OneToMany(type => Approval, approval => approval.task, { nullable: true, lazy: true })
  approvals: Promise<Approval[]>;

  @OneToMany(type => TaskMessage, taskMessage => taskMessage.task, { cascade: ['remove'], lazy: true })
  messages: Promise<TaskMessage[]>;

  constructor(partialTask: Partial<Task>) {
    Object.assign(this, partialTask);
  }

}
Run Code Online (Sandbox Code Playgroud)

谁能告诉我为什么关系task不会被分配/保存?

eya*_*oli 2

我认为您缺少cascade: true关系的选项,这应该设置在关系的宽松一侧(OneToMany) - 检查示例