如何使用 MikroORM 插入对象图?

Ser*_*kyi 3 javascript orm mikro-orm

我正在尝试一次创建和更新多个实体(模型)。我通过使用insertGraphAPI在反对 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 })
})
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*mek 7

这里的问题是,在使用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 })
})
Run Code Online (Sandbox Code Playgroud)

您可以通过将所有实体准备到一个数组中来使其更简单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 })
})
Run Code Online (Sandbox Code Playgroud)

此外,Object.assign()您可以IEntity.assign()在实体上使用方法而不是使用,该方法还将负责从普通标识符创建引用:

const article = new Article().assign(dto)
Run Code Online (Sandbox Code Playgroud)

更多信息IEntity.assign()可以在文档中找到:

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

您还可以使用EntityManager.create()helper,它将为您构造实体 - 这样做的好处是它会自动处理构造函数参数,将它们传递给构造函数而不是直接分配它们。

const article = req.em.create(Article, dto)
Run Code Online (Sandbox Code Playgroud)