问题说明
代码缩减后大致如下
首先定义了一个表结构体,关键点是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`
}
然后使用Preload
和First
方法获取值,并做修改,最后使用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
方法,还是不行。
解决方案
最后发现两种方案可以解决这个问题
- 清楚外键引用的数据,然后再保存
global.GVA_DB.Model(&enterpriseInfo).Association("ContactPersonInfo").Clear()
global.GVA_DB.Save(&participatingUnits)
Association("ContactPersonInfo").Clear()
这个方法,应该是enterpriseInfo.ContactPersonInfo
中的值给清空了。我怀疑把enterpriseInfo.ContactPersonInfo.ID
主键改成2问题也能解决(外键和外键引用的数据保持一致)。因为没时间试,感兴趣的朋友可以测试一下。
- 查询的时候把
Preload
方法去掉
//global.GVA_DB.Preload("ContactPersonInfo").Where("id = 1").First(&participatingUnits )
global.GVA_DB.Where("id = 1").First(&participatingUnits )