Mikro ORM重启服务器后丢失Game与GameMode实体关联问题求助
Game与GameMode关联重启后消失的解决方案
核心问题排查与修复步骤
1. 修正实体关联定义
首先确认实体的关联配置是否正确(匹配你的代码使用的ORM风格,以下以MikroORM为例):
Game实体正确配置
@Entity() export class Game { @PrimaryKey() id!: number; @Property() name!: string; @Property() active!: boolean; @Property() category!: Category; // 必须配置一对多反向关联,指向GameMode的game字段 @OneToMany(() => GameMode, gameMode => gameMode.game) gameModes = new Collection<GameMode>(this); }
GameMode实体正确配置
@Entity() export class GameMode { @PrimaryKey() id!: number; @Property() name!: string; // 多对一关联必须明确指向Game实体,外键会自动生成(默认game_id) @ManyToOne(() => Game) game!: Game; }
关键注意:你创建GameMode时用了大写的Game字段,但实体里定义的是小写game,字段名不匹配会导致外键未被正确赋值。
2. 修复GameMode创建代码
移除as any类型断言(会掩盖类型错误),并修正关联字段名:
@Mutation(() => GeneralResponse) @UseMiddleware(Authentication) @UseMiddleware(Admin) async createGameMode(@Ctx() { em }: MyContext, @Arg("gameId") gameId: number, @Arg("name") name: string ): Promise<GeneralResponse> { const gameMode = em.create(GameMode, { game: em.getReference(Game, gameId), // 改为小写game,匹配实体字段 name: name }); await em.persistAndFlush(gameMode); return { success: true }; }
3. 查询时主动加载关联
默认关联为懒加载,重启后EntityManager缓存清空,查询Game时必须主动指定加载关联:
@Query(() => Game) async getGame(@Arg("id") id: number, @Ctx() { em }: MyContext) { // 通过populate指定加载gameModes关联 return em.findOne(Game, id, { populate: ['gameModes'] }); }
4. 验证数据库外键数据
直接查询game_mode表的game_id字段,确认是否存在对应Game的ID值。如果该字段为空,说明关联未被持久化,需回到实体配置和创建代码排查。
内容的提问来源于stack exchange,提问作者Riad Joul
相关产品推荐
相关产品推荐

