如何删除ObjectBox中ToMany关联对象?执行RemoveId后关联对象未删除
ObjectBox删除Task后关联Workers未删除的原因及解决办法
原因
ObjectBox的ToMany关联默认不启用级联删除机制。调用box.RemoveId(id)删除Task时,仅会删除Task本身以及Task与Workers之间的关联记录,不会自动删除关联的Workers对象——这是框架的安全设计,避免误删可能被其他数据引用的关联对象。
解决办法
方法1:手动删除关联的Workers
在删除Task前,先获取其关联的所有Workers对象,逐个调用删除接口:
func main() { // ... 初始化代码省略 ... id, _ := box.Put(&model.Task{ Text: "Buy milk", Workers: workers, }) // 先获取Task及其关联的Workers task, err := box.Get(id) if err != nil { fmt.Println(err) return } // 手动删除所有关联的Workers for _, worker := range task.Workers { if err := box2.RemoveId(worker.Id); err != nil { fmt.Println(err) } } // 再删除Task box.RemoveId(id) // ... 验证代码省略 ... }
方法2:在模型中启用级联删除
如果Workers是Task的专属关联对象,不会被其他数据引用,可以在模型定义时给ToMany关联添加cascade属性,让ObjectBox自动级联删除关联对象:
// 模型Task结构体定义 type Task struct { Id uint64 Text string // 添加cascade参数开启级联删除 Workers []*model.Workers `objectbox:"toMany, cascade"` }
修改模型后,重新生成ObjectBox代码,此时调用box.RemoveId(id)删除Task时,关联的Workers会被自动删除。
内容的提问来源于stack exchange,提问作者Huihui
相关产品推荐
相关产品推荐

