TypeORM一对多/多对一关联数组为空、外键为null问题排查求助
问题原因
collection表不存在assets字段属于正常现象。一对多关系的外键默认存储在多的一方(也就是asset表),不会在一的一方存储冗余字段,这是关系型数据库的标准设计。asset表collectionId字段为null的核心原因是:你只给collection.assets赋值了Asset实例数组,但没有给每个Asset实例的collection属性绑定当前的Collection实例。TypeORM的级联保存依赖双向关联的场景下,需要主动维护双向关联的引用,不会自动反向填充关联属性。
解决方法
在给collection.assets赋值前,遍历所有Asset实例,手动绑定所属Collection即可:
const collection = await getCustomRepository(CollectionRepository).create( collectionResponse.collection as Object, ); const assets = await this.fetchAssets(collection); // 新增:手动给每个Asset绑定所属Collection assets.forEach(asset => { asset.collection = collection; }); const stats = await getCustomRepository(CollectionStatsRepository).create( statsResponse.stats as Object, ); collection.stats = stats; collection.assets = assets; return await getCustomRepository(CollectionRepository).save(collection);
补充说明
你原有配置里的eager: true和cascade: true参数是正确的,不需要调整。修改后重新执行保存逻辑,asset表的collectionId外键会自动填充,后续调用collection.find()查询时也能正常返回关联的assets数组。
内容的提问来源于stack exchange,提问作者user16780074
相关产品推荐
相关产品推荐

