我有一个实体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”的元数据。
我什至不知道是否可以这样做,因为对此有轻微的疑问,因此在创建一个实体时,我会在关系中创建另一个实体
就像 @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',
},
},
});