You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:24:03