如何解决TypeORM中遗留用户表一对一关联的列不存在错误?
问题:TypeORM关联遗留用户表时出现
Referenced column userid was not found in entity Foruser错误 我在基于Angular+NestJS+TypeORM开发现有系统的应用时,尝试关联两张遗留用户表,反复遇到错误:TypeORMError: Referenced column userid was not found in entity Foruser。由于其他应用仍在使用这些表,我无法修改主键列名。修改@JoinColumn参数或留空时,错误变为无法在Foruser中找到userid。
认证表(存储用户密码等信息)
@Index("pk_foruser", ["id"], { unique: true }) @Entity("foruser", { schema: "dbo" }) export class Foruser { @PrimaryColumn("varchar", { name: "id", length: 28 }) id: string; @OneToOne(() => Adbuinfo) Profile: Relation<Adbuinfo>; }
用户资料表(存储权限和应用详情)
@Index("pk_adbuinfo", ["userid"], { unique: true }) @Entity("adbuinfo", { schema: "dbo" }) export class Adbuinfo { @PrimaryColumn("varchar", { name: "userid", length: 32 }) userid: string; @OneToOne(() => Foruser, (Foruser) => Foruser.Profile, { cascade: true}) @JoinColumn({name: 'id', referencedColumnName: 'id'}) User: Relation<Foruser>; }
完整错误栈
TypeORMError: Referenced column userid was not found in entity Foruser at C:\Development\Web Adtakr-1\adtakr-service\src\metadata-builder\RelationJoinColumnBuilder.ts:151:27 at Array.map (<anonymous>) at RelationJoinColumnBuilder.collectReferencedColumns (C:\Development\Web Adtakr-1\adtakr-service\src\metadata-builder\RelationJoinColumnBuilder.ts:143:32) at RelationJoinColumnBuilder.build (C:\Development\Web Adtakr-1\adtakr-service\src\metadata-builder\RelationJoinColumnBuilder.ts:62:40) at C:\Development\Web Adtakr-1\adtakr-service\src\metadata-builder\EntityMetadataBuilder.ts:180:60 at Array.forEach (<anonymous>) at C:\Development\Web Adtakr-1\adtakr-service\src\metadata-builder\EntityMetadataBuilder.ts:173:22 at Array.forEach (<anonymous>) at EntityMetadataBuilder.build (C:\Development\Web Adtakr-1\adtakr-service\src\metadata-builder\EntityMetadataBuilder.ts:166:14) at ConnectionMetadataBuilder.buildEntityMetadatas (C:\Development\Web Adtakr-1\adtakr-service\src\connection\ConnectionMetadataBuilder.ts:106:11)
解决方案
问题出在一对一关联的配置不匹配,两张表主键列名不同(Foruser是id,Adbuinfo是userid),需明确指定列映射规则:
- 修改Foruser实体:在
@OneToOne装饰器中添加反向关联引用,并配置@JoinColumn映射到Adbuinfo的userid列
@Index("pk_foruser", ["id"], { unique: true }) @Entity("foruser", { schema: "dbo" }) export class Foruser { @PrimaryColumn("varchar", { name: "id", length: 28 }) id: string; @OneToOne(() => Adbuinfo, adbuinfo => adbuinfo.User) @JoinColumn({ name: "id", referencedColumnName: "userid" }) Profile: Relation<Adbuinfo>; }
- 修改Adbuinfo实体:移除错误的
@JoinColumn配置(一对一关联仅需在拥有外键映射的一方配置该装饰器)
@Index("pk_adbuinfo", ["userid"], { unique: true }) @Entity("adbuinfo", { schema: "dbo" }) export class Adbuinfo { @PrimaryColumn("varchar", { name: "userid", length: 32 }) userid: string; @OneToOne(() => Foruser, foruser => foruser.Profile, { cascade: true }) User: Relation<Foruser>; }
配置说明
@JoinColumn仅需在关联关系的一侧配置,这里选择在Foruser中定义,用自身主键id映射到Adbuinfo的主键useridreferencedColumnName指定的是关联目标实体(Adbuinfo)中的对应列名,name是当前实体(Foruser)用于关联的列名
内容的提问来源于stack exchange,提问作者Phoenix Stoneham
相关产品推荐
相关产品推荐

