如何在ObjectBox中存储标准构图类?

How to store standard composition Classes in ObjectBox?

我有 Class A 包含 List of Class B 包含 List Class C 那么我将如何在 ObjectBox 中实现这一点?我如何存储它?

在下图中你可以看到我有 BasicInfo Class 包含 Data class 等等。 ...

我在 BasicInfo class 上添加了 @Entinty 注释,并在生成模型后 class D 没有出现在 objectbox.g.dart 文件,因为它位于 BasicInfo 属性

  ModelEntity(
  id: const IdUid(1, 3501283007979667013),
  name: 'BasicInfo',
  lastPropertyId: const IdUid(1, 2073579066569957521),
  flags: 0,
  properties: <ModelProperty>[
    ModelProperty(
        id: const IdUid(1, 2073579066569957521),
        name: 'id',
        type: 6,
        flags: 1)
  ],
  relations: <ModelRelation>[],
  backlinks: <ModelBacklink>[])

如果你说Class A包含一个List of Class B,那么他们的关系不是subclass/superclass,而是一个标准的组合.我知道你的定义看起来有点像这样:

class A {
  List<B> bs;
}

class B {
  List<C> cs;
}

class C {}

为了在 ObjectBox 中使用它,您可以将它们定义为 relations,独立的 ToMany 关系,或带有反向链接的 ToOne 关系 - 取决于什么更好地描述您的数据,您可以用两者实现相同的效果。

第一个选择 - 使用 ToMany

ToMany 关系将信息存储在单独的“table”ID 中,例如:A.id <--> B.idB.id <--> C.id.

之间的另一个 ID
@Entity()
class A {
  int id;
  final bs = ToMany<B>();
}

@Entity()
class B {
  int id;
  final cs = ToMany<C>;
}

@Entity()
class C {
  int id;
}

第二种选择 - 使用带反向链接的 ToOne

ToOne 关系在您的情况下可以实现相同的效果,并且相关信息实际上作为单个 ID 存储在对象本身上,即有一个隐藏的 int B.classAId 字段,您可以获得所有Bs class A 实例通过寻找那些 Bs 指向这个 A。这是由带有 Backlink() 注释的 ToMany<> 在幕后完成的。

@Entity()
class A {
  int id;

  @Backlink()
  final bs = ToMany<B>();
}

@Entity()
class B {
  int id;
 
  final a = ToOne<A>; 

  @Backlink()
  final cs = ToMany<C>;
}

@Entity()
class C {
  int id;

  final b = ToOne<B>; 
}