TypeORM级联选项:cascade、onDelete、onUpdate
TypeORM cascade option: cascade, onDelete, onUpdate
TypeORM 中的级联选项是否重叠,或者它们的用途完全不同?他们在文档中的描述非常稀少,部分缺失,或者我找不到。
IOW,执行以下选项
{ cascade: "update" }
= { onUpdate: 'CASCADE' }
{ cascade: "remove" }
= { onDelete: 'CASCADE' }
有同样的效果吗?
或者 cascade
选项仅供 TypeORM 使用,而 onUpdate
和 onDelete
仅供数据库模式(由迁移创建)?
这是我调查后的结论:
cascade
选项 不会 影响数据库列约束,我相信 TypeORM 仅在评估如何将实体关系保存到数据库时使用它。我们可以这样定义实体:
@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
将 authorId
外键设置为 Book
上的 CASCADE onDelete。这意味着当作者被删除时,这本书也被删除了。
在 Author
上设置 cascade: true
告诉 TypeORM,如果在作者上附加了一本新书并且保存了作者,那么新书也应该保存到数据库中。像这样:
const author = await Author.findOne({ id: '123' });
author.books.push(new Book(...));
await author.save();
如果Book
没有设置级联,新书将不会保存到数据库
OneToMany 关系尚不支持 onDelete: 'CASCADE
。更多上下文在这里:https://github.com/typeorm/typeorm/issues/1913
TypeORM 中的级联选项是否重叠,或者它们的用途完全不同?他们在文档中的描述非常稀少,部分缺失,或者我找不到。
IOW,执行以下选项
{ cascade: "update" }
= { onUpdate: 'CASCADE' }
{ cascade: "remove" }
= { onDelete: 'CASCADE' }
有同样的效果吗?
或者 cascade
选项仅供 TypeORM 使用,而 onUpdate
和 onDelete
仅供数据库模式(由迁移创建)?
这是我调查后的结论:
cascade
选项 不会 影响数据库列约束,我相信 TypeORM 仅在评估如何将实体关系保存到数据库时使用它。我们可以这样定义实体:
@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
将 authorId
外键设置为 Book
上的 CASCADE onDelete。这意味着当作者被删除时,这本书也被删除了。
在 Author
上设置 cascade: true
告诉 TypeORM,如果在作者上附加了一本新书并且保存了作者,那么新书也应该保存到数据库中。像这样:
const author = await Author.findOne({ id: '123' });
author.books.push(new Book(...));
await author.save();
如果Book
没有设置级联,新书将不会保存到数据库
onDelete: 'CASCADE
。更多上下文在这里:https://github.com/typeorm/typeorm/issues/1913