تايب سكريبت - TypeORM العلامة cascade: true لا تحذف الكيانات المرتبطة
لا أستطيع معرفة ما إذا كان الأمر مني، أو خيار cascade: true لا يحذف الكيانات الفرعية عند إزالة الكيان الأب؟
@Entity()
export class Folder {
@PrimaryGeneratedColumn()
public readonly id: number;
@OneToMany(() => Segment, (segment) => segment.folder, {
cascade: true,
})
public segments: Segment[];
}
@Entity()
export class Segment {
@PrimaryGeneratedColumn()
public readonly id: number;
@ManyToOne(() => Folder, (folder) => folder.segments)
@JoinColumn()
public folder: Folder;
}
ثم أفعل
await getRepository(Folder).delete(id);
الذي يعطيني خطأ:
update or delete on table "folder" violates foreign key constraint "FK_12606f83d18e5ae0c7e5693f3fb" on table
"segment"
حاول أيضًا أن أفعل
const folder = await this.repository.findOneOrFail(id);
repository.remove(folder)
//or
folder.segments = null;
await this.repository.save(folder);
لا زال هناك خطأ...
لا أريد التكرار عبر جميع الكيانات الفرعية وإزالتها يدويًا. ظننت أن cascade: true يجب أن يتعامل معها وكذلك عند الحفظ أو التحديث. ربما يجب أن يكون الصياغة مختلفة؟
شكراً!
الإجابة رقم 1
Cascade يصف فقط ما يجب فعله مع الكيانات المرتبطة، ولا يكون له تأثير عند حذف الكيان نفسه. إذا كنت تريد حذف جميع القطاعات عند حذف مجلد، يجب عليك استخدام onDelete (هذه ميزة في قاعدة البيانات، خلاف ذلك يتم استخدام cascade، والتي يتم تنفيذها ضمن TypeORM. هذا يعني أنه يجب عليك إنشاء وتنفيذ الترحيلات عند إضافة onDelete). لذلك يجب أن يعمل هذا بالنسبة لك:
@Entity()
export class Segment {
@PrimaryGeneratedColumn()
public readonly id: number;
@ManyToOne(() => Folder, (folder) => folder.segments, { onDelete: 'CASCADE' })
@JoinColumn()
public folder: Folder;
}
الإجابة رقم 2
الكيان الأصلي => ضبط التسلسل إلى "إزالة"
// Parent Entity
@OneToMany(type => Comment, comment => comment.parent,{ cascade: ["remove"] })
replies: Comment[];
الكيان الفرعي => قم بتعيين onDelete إلى CASCADE و orphanedRowAction إلى delete.
// Child Entity
@ManyToOne(type => Comment, comment => comment.replies, {
onDelete: "CASCADE", orphanedRowAction: 'delete'
})
parent: Comment;
ملاحظة
عندما تريد حذف الأب مع أبنائه عليك أن تفعل ما يلي:
await ParentRepository.delete(parentId)
