如何使用 MikroORM 插入对象图?
How can I insert an object graph by using MikroORM?
我正在尝试同时创建和更新多个实体(模型)。我通过使用 insertGraph
API 在反对 ORM 中做到了这一点,如果它没有 id,它实际上插入实体,如果它有 id,则更新。
MikroORM 中有类似的API吗?
目前我正在这样做:
app.put('/articles', async (req, res) => {
const save = req.body.articles.map(async (dto) => {
const article = Object.assign(new Article(), dto)
await req.em.persistAndFlush(article)
})
await Promise.all(save)
res.send({ ok: true })
})
但它会生成多个交易,我想在单个交易中处理所有内容。
这里的问题是,当使用 persistAndFlush
方法时,您会立即通过等待承诺将实体持久保存到数据库中。相反,您可以调用 em.persistLater(article)
将其标记为持久化。然后调用 em.flush()
,这将在单个事务中提交对数据库的所有更改。
app.put('/articles', async (req, res) => {
req.body.articles.forEach(dto => {
const article = Object.assign(new Article(), dto)
req.em.persistLater(article)
})
await req.em.flush() // save everything to database inside single transaction
res.send({ ok: true })
})
您可以通过将所有实体准备到一个数组中来使其更简单,并且 persistAndFlush
相反:
app.put('/articles', async (req, res) => {
const articles = req.body.articles.map(dto => Object.assign(new Article(), dto))
await req.em.persistAndFlush(articles) // save everything to database inside single transaction
res.send({ ok: true })
})
此外,您可以在实体上使用 IEntity.assign()
方法,而不是使用 Object.assign()
,该方法还将负责从普通标识符创建引用:
const article = new Article().assign(dto)
有关 IEntity.assign()
的更多信息,请参阅文档:
https://b4nan.github.io/mikro-orm/entity-helper/
您也可以使用 EntityManager.create()
助手,它会为您构建实体 - 这样做的好处是它会自动处理 constructor parameters,将它们传递给构造函数而不是直接分配它们。
const article = req.em.create(Article, dto)
我正在尝试同时创建和更新多个实体(模型)。我通过使用 insertGraph
API 在反对 ORM 中做到了这一点,如果它没有 id,它实际上插入实体,如果它有 id,则更新。
MikroORM 中有类似的API吗?
目前我正在这样做:
app.put('/articles', async (req, res) => {
const save = req.body.articles.map(async (dto) => {
const article = Object.assign(new Article(), dto)
await req.em.persistAndFlush(article)
})
await Promise.all(save)
res.send({ ok: true })
})
但它会生成多个交易,我想在单个交易中处理所有内容。
这里的问题是,当使用 persistAndFlush
方法时,您会立即通过等待承诺将实体持久保存到数据库中。相反,您可以调用 em.persistLater(article)
将其标记为持久化。然后调用 em.flush()
,这将在单个事务中提交对数据库的所有更改。
app.put('/articles', async (req, res) => {
req.body.articles.forEach(dto => {
const article = Object.assign(new Article(), dto)
req.em.persistLater(article)
})
await req.em.flush() // save everything to database inside single transaction
res.send({ ok: true })
})
您可以通过将所有实体准备到一个数组中来使其更简单,并且 persistAndFlush
相反:
app.put('/articles', async (req, res) => {
const articles = req.body.articles.map(dto => Object.assign(new Article(), dto))
await req.em.persistAndFlush(articles) // save everything to database inside single transaction
res.send({ ok: true })
})
此外,您可以在实体上使用 IEntity.assign()
方法,而不是使用 Object.assign()
,该方法还将负责从普通标识符创建引用:
const article = new Article().assign(dto)
有关 IEntity.assign()
的更多信息,请参阅文档:
https://b4nan.github.io/mikro-orm/entity-helper/
您也可以使用 EntityManager.create()
助手,它会为您构建实体 - 这样做的好处是它会自动处理 constructor parameters,将它们传递给构造函数而不是直接分配它们。
const article = req.em.create(Article, dto)