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

如何解决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),需明确指定列映射规则:

  1. 修改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>;
}
  1. 修改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的主键userid
  • referencedColumnName指定的是关联目标实体(Adbuinfo)中的对应列名,name是当前实体(Foruser)用于关联的列名

内容的提问来源于stack exchange,提问作者Phoenix Stoneham

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 17:05:19