英文:
TypeORM OneToMany relation doesn't add entry to the array when it is created
问题
I am trying to create two entities - Assignment
and Lesson
. Each Lesson
can have multiple Assignment
s and each Assignment
can be part of one Lesson
. When I create a Lesson
with Assignment
s in it, the Assignments
get created, they are added to the assignments
array, and everything works.
When I create a Lesson
and then try to add a new Assignment
to it, the Assignment
is created, it is linked to the correct Lesson
, but the assignments
field in the Lesson
is not updated.
Is this how it is supposed to work, or is there any way to update the assignments
array in Lesson
?
Below is my code. I am using an in-memory SQLite database.
Assignment.ts
import { Entity, Column, PrimaryGeneratedColumn, TableInheritance, ManyToOne } from 'typeorm';
import { Lesson } from './Lesson';
@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class Assignment {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToOne(() => Lesson, (lesson) => lesson.assignments, { eager: true })
lesson: Lesson;
}
Lesson.ts
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm';
import { Assignment } from './Assignment';
@Entity()
export class Lesson {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Assignment, (assignment) => assignment.lesson, { cascade: true })
assignments: Assignment[];
}
I have tried adding @JoinColumn()
to the @ManyToOne
relation, but nothing changed.
英文:
I am trying to create two entities - Assignment
and Lesson
. Each Lesson
can have multiple Assignment
s and each Assignment
can be part of one Lesson
. When I create a Lesson
with Assignment
s in it, the Assignemnt
s get created, they are added to the assignments
array and everything works.
When I create a Lesson
and then try to add a new Assignment
to it, the Assignment
is created, it is linked to the correct Lesson
but the assignments
field in the Lesson is not updated.
Is this how it is supposed to work or is there any way to update the assignments
array in Lesson
?
Below is my code. I am using a sqlite in-memory database
Assignment.ts
import { Entity, Column, PrimaryGeneratedColumn, TableInheritance, ManyToOne, JoinColumn } from 'typeorm';
import { Lesson } from './Lesson';
@Entity()
@TableInheritance({ column: { type: 'varchar', name: 'type' } })
export abstract class Assignment {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@ManyToOne(() => Lesson, (lesson) => lesson.assignments, { eager: true })
@Column('json')
lesson: Lesson;
}
Lesson.ts
import { Entity, Column, PrimaryGeneratedColumn, OneToMany } from 'typeorm';
import { Assignment } from './Assignment';
@Entity()
export class Lesson {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@OneToMany(() => Assignment, (assignment) => assignment.lesson, { cascade: true })
@Column('json')
assignments: Assignment[];
}
I have tried adding @JoinColumn()
to the @ManyToOne
relation but nothing changed
答案1
得分: 0
你可能需要添加显示如何访问数据的代码...但我会试一试:
通常,你会像这样将一个课程添加到一个作业中:
const lesson = await Lesson.findOne({ where: { id: 1 }, relations: ['assignments'] });
const assignment = await Assignment.findOne({ where: { id: 1 } });
assignment.lesson = lesson;
await assignment.save();
// 在这一点上,课程不会包含你的新作业
// 你可以将它添加到 lesson.assignments 数组中
lesson.assignments.push(assignment);
// 或者你可以重新从数据库中读取
const lessonAfterAdd = await Lesson.findOne({ where: { id: 1 }, relations: ['assignments'] });
请注意,以上代码是基于提供的代码片段进行翻译的。
英文:
You should probably add your code that shows how you are accessing your data... but Ill take a stab:
typically you'll add a lesson to an assignment as follows:
const lesson = await Lesson.findOne({where:{id:1},relations:['assignments]})
const assignment = await Assignment.findOne({where:{id:1}}
assignment.lesson = assignment
await assignment.save()
// at this point lesson wont have your new assignment
// you could just add it to the lesson.assignments array
lesson.assignments.push(assignment)
// or you could re-read from the db
const lessonAfterAdd =
await Lesson.findOne({where:{id:1},relations['assignments]})
答案2
得分: 0
The solution was to remove the @Column
annotation from both of the fields - assignments and lesson.
I could also add a filed lessonId: number
with the @Column
annotation to store the lesson id in the Assignment.
英文:
The solution was to remove the @Column
annotation from both of the fields - assignments and lesson.
I could also add a filed lessonId: number
with the @Column
annotation to store the lesson id in the Assignment.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论