Как я могу вставить граф объектов с помощью MikroORM? - PullRequest
1 голос
/ 25 марта 2019

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

Есть ли похожий API в MikroORM?

В настоящее время яЯ делаю это:

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 Ответ

1 голос
/ 25 марта 2019

Проблема здесь в том, что при использовании метода 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...