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