Ошибка несоответствия ключа первопричины - PullRequest
0 голосов
/ 28 апреля 2019

В настоящее время я экспериментирую с sequelize.js и, более конкретно, с ассоциациями. То, что я пытаюсь достичь, заключается в следующем. У меня есть модели:

  1. Пользователь
  2. положение

Моя логика следующая:

  1. Пользователь может иметь или не иметь назначенной ему позиции
  2. Если у пользователя есть позиция, ее идентификатор сохраняется в поле "assignPositionId" таблицы пользователей.
  3. Если у пользователя нет позиции, то значение «assignPositionId» устанавливается равным нулю.
  4. Позиция может быть назначена более чем одному пользователю

Проблема, с которой я сталкиваюсь, заключается в том, что я могу успешно создать пользователя, но я не могу создать позицию! Я всегда получаю сообщение об ошибке:

SQLITE_ERROR: foreign key mismatch - "positions" referencing "users"
User.hasOne(Position, {
  sourceKey: "assignedPositionId",
  foreignKey: "id",
  as: "position"
});

Position.hasMany(User, {
  sourceKey: "id",
  foreignKey: "assignedPositionId",
  as: "users",

});

Я знаю, что это более чем просто - может быть, уже поздно, но я действительно не могу понять, что идет не так! Ваша помощь высоко ценится!

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

У меня были проблемы с использованием hasOne в этих случаях, вместо этого, как правило, вместо него можно использовать ownTo, например,

User.belongsTo(Position, {
   foreignKey: "assignedPositionId",
   as: "position"
});

Тем не менее, как выглядит сгенерированный SQL при создании позиции?Можете ли вы выполнить это непосредственно в оболочке Sqlite?Этот тип сообщения об ошибке иногда указывает на проблему с таблицей PK.

0 голосов
/ 04 мая 2019

@ KenOn10, спасибо за ваше предложение. Внимательно прочитав документацию и выполнив несколько тестов, я получил следующий подход, который отлично работает:

User.hasMany(Position, {
  as: "position",
  sourceKey: "assignedPositionId",
  foreignKey: "id",
  constraints: false
});

Position.belongsTo(User, {
  as: "users",
  foreignKey: "assignedPositionId",
  constraints: false
});

Еще раз спасибо за ваше время.

...