从默认npx typeorm init
项目开始:
@Entity()
export class A {
@PrimaryGeneratedColumn()
id!: number
@OneToMany(() => B, (b) => b.a)
bs: B[]
constructor(bs: B[]) {
this.bs = bs
}
}
@Entity()
export class B {
@PrimaryGeneratedColumn()
id!: number
@ManyToOne(() => A, (a) => a.bs)
a: A
constructor(a: A) {
this.a = a
}
}
AppDataSource.initialize().then(async () => {
const a = await AppDataSource.manager.save(new A([]))
await AppDataSource.manager.save(new B(a))
await AppDataSource.manager.save(new B(a))
await AppDataSource.manager.save(new B(a))
console.log(a.bs.length)
}).catch(error => console.log(error))
这将显示0
(a.bs
仍然为空(。
我希望a.bs
与保存的B
的水化。这不是在@ManyToOne
上提供逆映射的全部目的吗?
或者,如果我弄错了,维护DB<->;添加关系实体时的模型一致性?
您的映射定义是正确的。问题是对象a
是用bs
值的空数组初始化的,因此a.bs.length
返回0。
而您随后创建了实体B
的多个记录。对象a
不知道这些。既然数据库中的一些关系/映射已经更改,Typeorm就不会跟踪或查找项目中的所有实体并刷新它们。为了刷新映射,您需要从数据库中重新加载a
:
await a.reload();
使得CCD_ 13现在知道更新的映射。