Как я могу вставить граф объектов с помощью MikroORM?

Я пытаюсь создать и обновить несколько объектов (моделей) одновременно. Я сделал это в возражении ОРМ с помощью insertGraph API, который фактически вставляет объект, если у него нет идентификатора, и обновляет, если у него есть идентификатор.

Есть ли в 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 ответ

Решение

Проблема здесь в том, что при использовании 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)

Больше о IEntity.assign() можно найти в документации:

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

Вы также можете использовать EntityManager.create() помощник, который создаст для вас сущность - преимущество в том, что он будет автоматически обрабатывать параметры конструктора, передавая их конструктору, а не назначая их напрямую.

const article = req.em.create(Article, dto)
Другие вопросы по тегам