Как я могу вставить граф объектов с помощью 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)