一对多 - 续集更新 - 不是 removing/inserting children

one to many - sequelize update - not removing/inserting children

所以我已经为 one-to-many 映射更新苦苦挣扎了几个小时。

我有一个 project 有一定的 tasks (例如)。 我通过前端添加和删除任务,并将修改后的 object 发送到后端 运行 sequelize.

然后我尝试更新记录如下:

return models.Project
    .findOne({
        where: { id: projectToUpdate.id },
        include: [models.Task]
    })
    .then(function (ProjectFromDb) {
        return models.sequelize
            .transaction({
                isolationLevel: models.sequelize.Transaction.ISOLATION_LEVELS.READ_COMMITTED
            },
            function (t) {
                return ProjectFromDb
                    .update(projectToUpdate,
                    {
                        include: [{ model: models.Task }]
                    })
                });
    })
    .then(function (result) {
        return output.getSuccessResult(....
    })
    .catch(function (error) {
        return output.getErrorResult(....
    });

但这只会更新 Project

接下来我尝试通过额外的 then 调用来更新它们:

.then(function (updateResult) {
        return updateResult.setTasks(projectToUpdate.Tasks, {transaction: t})
    })

但这会给我的结果是他正在尝试更新 Task 并将 ProjectId 设置为 NULL 这是不可能的,因为它是 non-nullable .

我目前正在 "manually" 添加 tasks 并删除它们,但这似乎是一种愚蠢的框架使用方式。

任何人都可以告诉我如何在 one-to-many 关系中正确地完成这项工作而无需我调用 Tasks.createBulkTasks.destroy

编辑以包含模型 JSON object 看起来像这样:

{
    id: 1,
    projectName: 'nameOfTheProject',
    Tasks: [
        projectId: 1,
        name: 'taskName'
    ]
}

请尝试将嵌套到 projectToUpdate 对象的 Tasks 对象的 属性 名称 projectId 更改为 ProjectId


更新

Looking at sequelize's source, it seems that the Instance.$save() function (which is called by Instance.$update() 您正在使用)不支持在您 更新 时创建嵌套模型 - 它检查标志 wasNewRecord 是否true 在做之前。