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

TypeORM使用Entity Schema Definitions实现单表继承失败如何解决

修复方案

你缺失了单表继承必需的鉴别器列和子类鉴别值的配置,按以下步骤修改即可:

  1. 基类AttendeeSchema新增discriminatorColumn配置,指定type字段为鉴别器
  2. 每个子类Schema新增discriminatorValue配置,绑定对应枚举值
  3. 实体注册时需同时包含基类和所有子类的Schema

修改后的完整Schema配置如下:

基类AttendeeSchema

export const AttendeeSchema = new EntitySchema<IAttendee>({
  name: 'attendees',
  target: Attendee,
  // 新增鉴别器列配置
  discriminatorColumn: {
    name: 'type',
    type: 'enum',
    enum: AttendeeType
  },
  columns: {
    ...primaryKeySchema,
    type: {
      type: 'enum',
      enum: AttendeeType,
      nullable: false,
      default: AttendeeType.Guest,
    },
    givenName: {
      type: 'varchar',
      name: 'name_givenName',
      length: 50,
      nullable: false,
    },
    familyName: {
      type: 'varchar',
      name: 'name_familyName',
      length: 50,
      nullable: false,
    },
    vonageSessionToken: {
      type: 'varchar',
      length: 500,
      nullable: false,
    },
    isHost: {
      type: 'boolean',
      nullable: false,
      default: false,
    },
  },
  relations: {
    meeting: {
      type: 'many-to-one',
      target: Meeting,
      nullable: false,
      joinColumn: true,
      orphanedRowAction: 'delete',
    },
  },
});

子类GuestSchema

export const GuestSchema = new EntitySchema<IGuest>({
  name: 'guests',
  target: Guest,
  extends: 'attendees',
  type: 'entity-child',
  // 绑定当前子类对应的鉴别器值
  discriminatorValue: AttendeeType.Guest,
  columns: {
    // 若使用TypeORM 0.3+版本,该测试字段可直接删除,支持空columns配置
    test: {
      type: 'varchar',
      length: 10,
      nullable: true,
    },
  },
});

子类MemberSchema

export const MemberSchema = new EntitySchema<IMember>({
  name: 'members',
  target: Member,
  extends: 'attendees',
  type: 'entity-child',
  // 绑定当前子类对应的鉴别器值
  discriminatorValue: AttendeeType.Member,
  columns: {
    _username: {
      type: 'varchar',
      name: 'username',
      length: 36,
      nullable: true,
    },
  },
});

注意事项

  • TypeORM版本需不低于0.2.41,低于该版本对EntitySchema的单表继承支持存在已知缺陷
  • 查询基类attendees时,TypeORM会自动根据type字段返回对应子类的实例,无需额外逻辑处理

内容的提问来源于stack exchange,提问作者Matt Talbert

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:06:03