Dart中如何在@freezed实体内定义ObjectBox的一对多关联关系?
ObjectBox 结合 freezed 定义一对多关联的修改步骤如下:
1. 先确保 Permission 实体已定义正向关联
首先在 Permission 实体中添加指向 CurrentUser 的 ToOne 关联字段,如果 Permission 同样使用 freezed 定义,需要额外添加私有构造和自定义关联字段:
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:objectbox/objectbox.dart'; import 'current_user.dart'; part 'permission.freezed.dart'; part 'permission.g.dart'; @freezed class Permission with _$Permission { // 必须添加私有构造才能自定义字段 const Permission._(); @Entity(realClass: Permission) factory Permission({ @Id(assignable: true) int? localId, // 你原有Permission的其他字段,比如权限名、权限编码等 required String permissionCode, }) = _Permission; factory Permission.fromJson(Map<String, dynamic> json) => _$PermissionFromJson(json); // 正向关联到CurrentUser late final currentUser = ToOne<CurrentUser>(); }
2. 修改 CurrentUser 实体添加反向一对多关联
修改 CurrentUser 实体,添加私有构造、ToMany 关联字段,同时给原有构造参数中的 permissions 加 @Transient 注解标记为非持久化字段:
import 'package:admin/core/auth/enums/content_type.dart'; import 'package:admin/core/permission/model/permission.dart'; import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:objectbox/objectbox.dart'; part 'current_user.freezed.dart'; part 'current_user.g.dart'; @freezed class CurrentUser with _$CurrentUser { // 必须添加私有构造才能自定义字段 const CurrentUser._(); @Entity(realClass: CurrentUser) factory CurrentUser( {@Id(assignable: true) int? localId, @Unique() String? id, required DateTime createdAt, required DateTime updatedAt, required String email, required String username, String? mobile, @Default(false) bool? isEmailConfirmed, @Default(false) bool? isMobileConfirmed, @Default(false) bool? isSuperAdmin, @Default([]) List<ContentType>? accessTo, DateTime? lastLoginAt, DateTime? lastLogoutAt, // 标记该字段仅用于JSON序列化,不由ObjectBox持久化 @Transient() @Default([]) List<Permission>? permissions}) = _CurrentUser; factory CurrentUser.fromJson(Map<String, dynamic> json) => _$CurrentUserFromJson(json); // 反向一对多关联,指向Permission实体中的currentUser字段 @Backlink(to: "currentUser") late final permissionRel = ToMany<Permission>(); }
3. 关联操作注意事项
- 从JSON反序列化得到CurrentUser实例后,需要手动把构造参数中
permissions列表的元素赋值给permissionRel:final user = CurrentUser.fromJson(json); user.permissionRel.addAll(user.permissions ?? []); - 持久化数据时,需要先保存所有Permission实例,再保存CurrentUser实例,ObjectBox会自动维护两者的关联关系。
- 读取数据时,直接访问
currentUser.permissionRel即可获取关联的所有权限列表。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

