簡體   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