繁体   English   中英

OneToOne 和 ManyToOne 的 TypeORM 循环依赖

[英]TypeORM cyclic dependency with OneToOne and ManyToOne

我有这两个相互关联的实体:

@Entity()
export class Message {

    // ... other columns ...

    @OneToMany(() => Action, action => action.message, { eager: true, cascade: true })
    public actions: Action[];
}
@Entity()
export class Action {

    // ... other columns ...

    @ManyToOne(() => Message, message => message.actions, { nullable: false })
    public message?: Message;
}

但是我想在用户采取行动时记录在消息实体上。 我尝试像这样向消息添加额外的关系:

@Entity()
export class Message {

    // ... other columns ...

    @OneToMany(() => Action, action => action.message, { eager: true, cascade: true })
    public actions: Action[];

    @OneToOne(() => Action, { nullable: true })
    @JoinColumn()
    public action_taken: Action;
}

但是,当尝试保存填充了actions关系的新消息时(尝试使用cascade: true一次保存它们),然后出现以下错误:

TypeORMError: Cyclic dependency: "Action"
    at new TypeORMError (/app/node_modules/typeorm/error/TypeORMError.js:9:28)
    at visit (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:144:23)
    at visit (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:160:21)
    at visit (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:160:21)
    at SubjectTopoligicalSorter.toposort (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:139:17)
    at SubjectTopoligicalSorter.sort (/app/node_modules/typeorm/persistence/SubjectTopoligicalSorter.js:53:45)
    at SubjectExecutor.<anonymous> (/app/node_modules/typeorm/persistence/SubjectExecutor.js:99:124)
    at step (/app/node_modules/tslib/tslib.js:143:27)
    at Object.next (/app/node_modules/tslib/tslib.js:124:57)
    at /app/node_modules/tslib/tslib.js:117:75

设置cascade: false不会抛出错误,但也不会保存相关记录。

我错过了什么? 有没有办法我仍然可以拥有cascade: true并且与实体有双重关系? 还是我必须手动保存相关记录?

有这个问题,在 nest CLI 上工作正常,但在使用无服务器和 webpack 时出现问题。 Typeorm 不适用于 webpack。 我使用了 repository.save (entity) 并且总是因循环依赖而失败。

切换到后

repository.createQueryBuilder()
.insert()
.values(data)
.execute();

此错误已被清除。 我真的建议尝试更改存储库方法,因为 save() 方法等待完整的实体集,而 createQueryBuilder() 获取实体值并将它们转换为字符串值,进行正常查询。

有这个问题,在@ManyToOne @OneToMany关系中,可以通过删除没有cascade的关系的一侧来解决。 错误消失,级联工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM