Автоматическая генерация файла разработчика DataContext при использовании SqlMetal и Visual Studio

Цикл for отправляет запросы, которые асинхронно заполняют sendersArray. Если вы console.log(sendersArray) синхронно после запуска цикла for, он еще не будет заполнен. Вместо цикла for используйте .map и Promise.all для ожидания завершения всех запросов:

exports.getRecipientdata = (req, res) => {
  const userId = req.params.recipientId;
  const sendersArray = [];
  Transaction.findAll({
    where: {
      id_recipient: userId,
    },
  }).then(transactions => {
    return Promise.all(transactions.map(({ id_sender }) => (
      User.findOne({
        where: {
          id: id_sender,
        },
        attributes: ['id', 'name', 'surname'],
        include: [
          {
            model: Transaction,
            where: { id_sender: db.Sequelize.col('user.id') },
            attributes: [
              'amount_money',
              'date_time',
              'transfer_title',
              'id_recipient',
              'id_sender',
            ],
          },
        ],
      })
        .then(sender => {
          sendersArray.push(sender);
        })
        .catch(err => {
          console.log(err);
        })
    )));
  })
  .then(() => {
    res.send(sendersArray);
  });
};

Другая возможность, вместо push обращения к внешней переменной, состоит в используйте массив, созданный Promise.all, и отфильтруйте по логическим значениям, чтобы удалить значения Falsey (поскольку отсутствие возвращаемого значения catch приведет к тому, что undefined будет присутствовать в результате массива Promise.all ):

exports.getRecipientdata = (req, res) => {
  const userId = req.params.recipientId;
  Transaction.findAll({
    where: {
      id_recipient: userId,
    },
  }).then(transactions => {
    return Promise.all(transactions.map(({ id_sender }) => (
      User.findOne({
        where: {
          id: id_sender,
        },
        attributes: ['id', 'name', 'surname'],
        include: [
          {
            model: Transaction,
            where: { id_sender: db.Sequelize.col('user.id') },
            attributes: [
              'amount_money',
              'date_time',
              'transfer_title',
              'id_recipient',
              'id_sender',
            ],
          },
        ],
      })
        .catch(err => {
          console.log(err);
        })
    )));
  })
  .then((sendersArray) => {
    res.send(sendersArray.filter(Boolean));
  });
};
5
задан Yaakov Ellis 25 September 2008 в 14:14
поделиться

1 ответ

designer.cs файл обычно сохраняется автоматически, поскольку Вы вносите изменения в DBML в рамках Visual Studio. Если VS не работает при воссоздании DBML, он не может знать.

Проверьте, что.DBML файл в Visual Studio имеет набор свойств Инструмента пользователя к MSLinqToSQLGenerator. Если это не, то установлено это на это. Если это - щелчок правой кнопкой попытки по DBML после внесения изменений и выбора Run Custom Tool, чтобы видеть, обновляет ли это .designer.cs.

Можно также генерировать использование файла класса SqlMetal:

sqlmetal /code:DataContext.designer.cs /language:csharp DataContext.dbml
6
ответ дан 14 December 2019 в 01:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: