在实体初始化期间初始化另一个实体(TypeORM)

问题描述 投票:0回答:1

我有一个实体Store,它本身存储

@Entity('shops')
export class ShopEntity{
  @PrimaryGeneratedColumn()
  id: number;

  @OneToOne(() => ScheduleEntity)
  @JoinColumn()
  schedule: ScheduleEntity;
}

我还有一个 Schedule 实体

@Entity('schedules')
    export class ScheduleEntity {
      @PrimaryGeneratedColumn()
      id: number;
    
      @Column('jsonb')
      monday: DayDto;
    }

在店铺实体中,我插入了这么一个普通的东西

  @AfterInsert()
  async createDefaultSchedule() {
    const schedule = new ScheduleEntity();
    const initialDay: DayDto = {
      bags: 0,
      enabled: true,
      timeEnd: '16:00',
      timeStart: '15:00',
    };

    schedule.monday = initialDay;

    const scheduleRepo = await Data.getRepository(ScheduleEntity);
    scheduleRepo.save(schedule);
  }

但是创建商店时出现错误: EntityMetadataNotFoundError:找不到“ScheduleEntity”的元数据。

我什至不知道是否可以这样做,因为对此有轻微的疑问,因此在创建一个实体时,我会在关系中创建另一个实体

postgresql typeorm nest
1个回答
0
投票

就像 @nbk 提到的,您的

shops
表与
schedules
表具有一对一的关系。

根据您的实体定义,如果不创建相关的

ShopEntity
ScheduleEntity
就无法存在,因为
ShopEntity
具有外键约束(
@JoinColumn()
装饰器定义哪个实体将保存外键)。

要解决此特定问题,您可以像这样修改实体:

@Entity('shops')
export class ShopEntity{
  @PrimaryGeneratedColumn()
  id: number;

  // Remove `@JoinColumn()` decorator from this entity.
  @OneToOne(() => ScheduleEntity)
  schedule: ScheduleEntity;
}
@Entity('schedules')
export class ScheduleEntity {
  @PrimaryGeneratedColumn()
  id: number;
    
  @Column('jsonb')
  monday: DayDto;

  // Add `@JoinColumn()` decorator to this entity.
  @OneToOne(() => ShopEntity)
  @JoinColumn()
  shop: ShopEntity
}

现在您的

ShopEntity
无需先有
ScheduleEntity
就可以存在。


但是,我相信你在这里根本不需要使用

@AfterInsert
。您可以简单地同时保存两个实体,如下所示:

await shopRepo.save({
  id: 'shopID',
  // Simply add the properties of `ScheduleEntity` inside `ShopEntity` 
  // like this (don't add an `id` for `ScheduleEntity` since it will
  // be done by TypeORM automatically).
  schedule: {
    monday: {
      bags: 0,
      enabled: true,
      timeEnd: '16:00',
      timeStart: '15:00',
    },
  },
});
© www.soinside.com 2019 - 2024. All rights reserved.