如何使用MikroORM插入对象图?

时间:2019-03-25 13:33:17

标签: javascript orm mikro-orm

我正在尝试一次创建和更新多个实体(模型)。我是通过使用insertGraph API来反对ORM的,该API实际上在没有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 })
})

但是它会生成多个交易,而我想在单个交易中完成所有交易。

1 个答案:

答案 0 :(得分:1)

这里的问题是,当使用null方法时,您会通过等待诺言将实体立即保存到数据库中。相反,您可以调用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 }) }) 方法,而不是使用Object.assign(),该方法还将用于从普通标识符创建引用:

IEntity.assign()

有关const article = new Article().assign(dto) 的更多信息可以在文档中找到:

https://b4nan.github.io/mikro-orm/entity-helper/

您还可以使用IEntity.assign()帮助程序,该帮助程序将为您构造实体-这样做的好处是它将自动处理constructor parameters并将其传递给构造函数,而不是直接分配它们。

EntityManager.create()