繁体   English   中英

TypeOrm更新实体不更新相关的

[英]TypeOrm update Entity not updating related one

我有这个实体:

export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  password: string;

  @Column({ default: false })
  activated: boolean;

  @OneToOne(() => UserAnag, (userAnag) => userAnag.user)
  useranag: UserAnag;
}

和这个相关实体

@Entity()
export class UserAnag {
@PrimaryGeneratedColumn()
  id: number;
  @Column()
  name: string;
  @Column()
  surname: string;

   @OneToOne(() => User, (user) => user.useranag, {
    onUpdate: 'CASCADE',
    onDelete: 'CASCADE',
  })
  @JoinColumn()
  user: User;

这是我的更新 function:

async update(id: number, attrs: Partial<UpdateUserDto>) {
    const user = await this.findById(id);
    if (!user) {
      throw new NotFoundException('User not found');
    }
    if (attrs.useranag) {
      const useranag = Object.assign(user.useranag, attrs.useranag);
      Object.assign(user, attrs);
      user.useranag = useranag;
    } else {
      Object.assign(user, attrs);
    }
    return this.repo.save(user);
  }

我的 findById function

    if (!id) {
      return null;
    }
    const user = await this.repo.find({
      where: { id: id },
      relations: { useranag: true },
    });
    return user[0];
  }

如果我对此进行调试,我可以看到userEntity已正确更新,并且返回也已更新正确的 object 但在数据库上,只有User实体已正确更新,而不是 Useranag 实体。 我尝试在 Useranag 上设置 eager 但遇到同样的问题。 数据库仅在 User 中更新,而不在 Useranag 中更新

附加信息:我正在记录查询,在更新之前,select 只有 useranag 实体上的 id 和 userId 明显等于原始并且没有启动更新查询

级联语法不同。 您可以将其设置为cascade: true或要级联的操作列表

 @OneToOne(() => User, (user) => user.useranag, {cascade: true})
  @JoinColumn()
  user: User;
 @OneToOne(() => User, (user) => user.useranag, {cascade: ['update', 'delete']})
  @JoinColumn()
  user: User;

资料来源: https://orkhan.gitbook.io/typeorm/docs/relations#cascades

我已经解决了这个问题。 我混淆了 onUpdate 和 cascade: ['update']

我发现更新相关实体的正确方法是在我要更新的实体中设置cascade: ['update'] ,而不是在相关实体中。

所以正确的代码是:

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  email: string;

  @Column()
  password: string;

  @Column({ default: false })
  activated: boolean;

  @OneToOne(() => UserAnag, (userAnag) => userAnag.user, {
    cascade: ['update'],
  })
  useranag: UserAnag;
}

@Entity()
export class UserAnag {
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  name: string;
  @Column()
  surname: string;
  @Column()
  psn: string;
  @Column()
  discord: string;
  @Column()
  drivernumber: number;

  @OneToOne(() => User, (user) => user.useranag, {
    onDelete: 'CASCADE',
  })
  @JoinColumn()
  user: User;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM