You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:45:47