gorm 无法更新带有外键的字段

问题说明

代码缩减后大致如下
首先定义了一个表结构体,关键点是ContactPersonId作为外键关联到ServiceUsers

type ParticipatingUnits struct {
	global.GVA_MODEL
	Name                  string       `gorm:"column:name"`
	ContactPersonId       uint         ` gorm:"column:contact_person_id"`
	ContactPersonInfo     ServiceUsers `gorm:"foreignKey:ContactPersonId;references:ID"`
	ContactName           string       `gorm:"column:contact_name`
}

然后使用PreloadFirst方法获取值,并做修改,最后使用save方法保存

var participatingUnits model.ParticipatingUnits
global.GVA_DB.Preload("ContactPersonInfo").Where("id = 1").First(&participatingUnits )
participatingUnits .ContactName= "张三"
participatingUnits .ContactPersonId= 2
global.GVA_DB.Save(&participatingUnits)

最终结果,ContactName更新成功。ContactPersonId 还是之前的值。这就很费解,又尝试了updates方法,还是不行。

解决方案

最后发现两种方案可以解决这个问题

  1. 清楚外键引用的数据,然后再保存
global.GVA_DB.Model(&enterpriseInfo).Association("ContactPersonInfo").Clear()
global.GVA_DB.Save(&participatingUnits)

Association("ContactPersonInfo").Clear()这个方法,应该是enterpriseInfo.ContactPersonInfo中的值给清空了。我怀疑把enterpriseInfo.ContactPersonInfo.ID主键改成2问题也能解决(外键和外键引用的数据保持一致)。因为没时间试,感兴趣的朋友可以测试一下。

  1. 查询的时候把Preload方法去掉
//global.GVA_DB.Preload("ContactPersonInfo").Where("id = 1").First(&participatingUnits )
global.GVA_DB.Where("id = 1").First(&participatingUnits )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值