Sequelize无法保存关联对象:单元测试场景下的问题咨询
解决Sequelize无法保存关联对象修改的问题
这个问题的核心在于:Sequelize不会自动级联保存关联实例的修改。当你修改了关联的hydrogen对象后,仅仅调用主模型compositions[0].save()只会保存compositions实例本身的变化,并不会同步更新关联的atom(也就是hydrogen)实例。
解决方案1:直接保存关联的实例
既然你已经修改了hydrogen的属性,最直接的方式就是调用它自己的save()方法来持久化修改:
test('it saves included instances', async() => { /* 获取"water"组分 */ const compositions = await _compositions.findAll( {include: [{model: _elements, where: {name: 'water'}}, _atoms]}); let hydrogen = compositions[0].get('atom'); /* 将"氢"重命名为"My super Hydrogen" */ hydrogen.name = 'My super Hydrogen'; /* 先保存关联的hydrogen实例 */ await hydrogen.save(); /* (可选)如果compositions[0]本身也有修改,再保存它 */ await compositions[0].save(); /* 现在获取新的氢实例就能看到修改了 */ });
解决方案2:使用关联的setter方法更新并保存
如果你希望通过主模型来处理关联对象的更新,可以使用Sequelize自动生成的关联setter方法(比如setAtom,具体名称取决于你的关联定义):
test('it saves included instances', async() => { const compositions = await _compositions.findAll( {include: [{model: _elements, where: {name: 'water'}}, _atoms]}); let hydrogen = compositions[0].get('atom'); hydrogen.name = 'My super Hydrogen'; /* 使用setAtom方法更新关联,该方法会自动保存修改 */ await compositions[0].setAtom(hydrogen); /* 此时hydrogen的修改已经被持久化了 */ });
为什么原来的代码不生效?
Sequelize的模型实例是独立的,主模型的save()方法只会处理自身的属性变更。关联实例的修改属于另一个模型的操作,必须显式调用该关联实例的save()方法,或者通过关联的setter方法来触发保存。
另外还要注意:你的原代码中compositions[0].save()没有使用await,这会导致异步操作未完成就执行后续代码,即使主模型的保存也可能没生效,所以一定要加上await来确保操作完成。
内容的提问来源于stack exchange,提问作者vdegenne
相关产品推荐
相关产品推荐

