TypeORM使用Entity Schema Definitions实现单表继承失败如何解决
修复方案
你缺失了单表继承必需的鉴别器列和子类鉴别值的配置,按以下步骤修改即可:
- 基类
AttendeeSchema新增discriminatorColumn配置,指定type字段为鉴别器 - 每个子类Schema新增
discriminatorValue配置,绑定对应枚举值 - 实体注册时需同时包含基类和所有子类的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
相关产品推荐
相关产品推荐

