Dart ObjectBox中如何正确使用Backlink反向关系执行关联查询?
问题原因与解决方案
报错核心原因
@Backlink标注的ToMany反向关系字段不会被生成到对应的实体元类(也就是你用到的Equipment_)中,所以访问Equipment_.faults必然触发未定义属性的报错,这是ObjectBox Dart的代码生成规则:反向关系仅作为实体类的运行时访问属性存在,不会纳入查询用的元类定义。- 查询方向完全错误:你最终要获取的是
Equipment实例,应该从Equipment的Box发起查询,而非Fault的Box。
正确实现代码(直接用Backlink满足需求)
你对Backlink的作用理解没有问题,完全可以用它直接查询所有关联了Fault的Equipment,不需要先查全量Fault再过滤,正确写法如下:
// 从Equipment的Box发起查询,而非Fault的Box final eqQuery = _localDbBaseService.equipmentBox.query() // backlink第一个参数为「指向当前查询实体的其他实体的关系字段」,也就是Fault类中指向Equipment的equipment字段 ..backlink(Fault_.equipment, Fault_.id.notNull()); final equipmentWithFault = eqQuery.build().find(); return equipmentWithFault;
Backlink用法规则说明
Dart版本ObjectBox的Backlink查询遵循以下规则:
- 谁发起查询就用谁的Box:你要返回什么类型的实体,就从对应Box发起查询
- backlink的第一个参数永远是被关联实体中指向当前查询实体的直接关系字段,不需要用到当前实体定义的
@Backlink标注的字段
内容的提问来源于stack exchange,提问作者Swisscheese
相关产品推荐
相关产品推荐

