TypeORM:保存时无法读取未定义的属性“inverseJoinColumns”

Posted

技术标签:

【中文标题】TypeORM:保存时无法读取未定义的属性“inverseJoinColumns”【英文标题】:TypeORM: Cannot read property 'inverseJoinColumns' of undefined when saving 【发布时间】:2017-12-20 13:31:18 【问题描述】:

用例:如果用户尚未在数据库中创建,则创建它 - 如果用户已存在,则更新它。

这样做的逻辑是有效的。由于 TypeORM 的 .save() 更新实体或在不可用时更新它们,我想使用这种方法。

我的问题:创作作品但不更新。执行此操作时,它会从 RelationIdLoader 抛出此错误:

this.userRepository.save(user); // user = newly created or updated entity

TypeError:无法读取未定义的属性“inverseJoinColumns”

更新的和创建的唯一区别是更新的有一个id属性,它是一个uuid/string。

更新

@PrimaryGeneratedColumn('uuid') public id: string;

... // some columns without relations

@OneToMany(type => Finding, finding => finding.reporter)
public reportedFindings: Finding[];

@OneToMany(type => Finding, finding => finding.responsible)
public responsibleFindings: Finding[];

@ManyToMany(type => DataCenter)
public dataCenterResponsiblities: DataCenter[];

@ManyToMany(type => Finding)
public informedFindings: Finding[];

【问题讨论】:

显示你的实体,可能是你错误地设置了实体关系 @pleerock 就这么做了。感谢您的关注。 如果你使用@ManyToMany,你也必须放置@JoinTable装饰器(只在拥有方,因为你有一个单向关系,所以你只把它放在这里)。 修复了它。非常感谢@pleerock 这个伟大的图书馆。很快就会有另一个问题出现。 :) 请找时间回答你自己的问题并接受它以改善***的用户体验 【参考方案1】:

正如@pleerock 所说,所有@ManyToMany 都必须在拥有方包含@JoinTable 装饰器。

所以我的实际问题的具体解决方案如下:

@ManyToMany(type => DataCenter)
@JoinTable()
public dataCenterResponsiblities: DataCenter[];

@JoinTable()
@ManyToMany(type => Finding)
public informedFindings: Finding[];

This is actually well described in the docs.

【讨论】:

拥有方是指更新关系的一方? @Nicu 示例:通过数据中心的 ID 将结果分配给数据中心。所以数据中心“拥有”调查结果[]。

以上是关于TypeORM:保存时无法读取未定义的属性“inverseJoinColumns”的主要内容,如果未能解决你的问题,请参考以下文章

NestJS TypeORM InjectRepository 无法读取未定义的属性“原型”

无法读取未定义的属性“上下文” - GraphQL

“无法读取未定义的属性 'tablePath'”(类型 ORM)

JQuery:未捕获的类型错误:无法读取未定义的属性“调用”

System.err:TypeError:无法读取未定义的属性“onNavigatingTo”

反应:TypeError:无法读取未定义的属性“setState”