问题
Do cascade options in TypeORM overlap or do they have a completely different purpose? Their description in the documentation is very scarce and partly missing, or I couldn't find it.
IOW, do the following options
{ cascade: "update" }
= { onUpdate: 'CASCADE' }
{ cascade: "remove" }
= { onDelete: 'CASCADE' }
have the same effect?
Or the cascade
option is only for the TypeORM use while onUpdate
and onDelete
are only for the DB schema (created by migration)?
回答1:
This is my conclusion of looking into it:
The cascade
option does not affect the database column constraints, and I believe is used by TypeORM only in evaluating how to save entity relations to the database. We can define entities like this:
@Entity()
class Book extends BaseEntity {
@ManyToOne(() => Author, (author) => author.books, {
onDelete: 'CASCADE',
})
public author?: Author
}
@Entity()
class Author extends BaseEntity {
@OneToMany(() => Book, (book) => book.author, {
cascade: true,
})
public books: Book[];
}
onDelete
sets the authorId
foreign key to CASCADE onDelete on Book
. This means that when the author is deleted, the book is also deleted.
Setting cascade: true
on Author
tells TypeORM that if a new book is appended on an author and the author is saved, the new book should also be saved to the database. Like this:
const author = await Author.findOne({ id: '123' });
author.books.push(new Book(...));
await author.save();
If cascade is not set on Book
, the new book will not be saved to the database.
回答2:
onDelete: 'CASCADE
isn't supported in OneToMany relations yet. More context here: https://github.com/typeorm/typeorm/issues/1913
来源:https://stackoverflow.com/questions/55098023/typeorm-cascade-option-cascade-ondelete-onupdate