8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

通过多对多链接管理实体之间的关系

Lenard Kasselmann 1月前

6 0

我有 2 个实体 User 和 Location,它们之间有“多对多”关系。创建关系似乎可行,但删除则不行。目的不是删除实体,而是删除关系。

我有 2 个实体 User ,并且 Location 具有多对多链接。创建关系似乎有效,但删除无效。目标不是删除 实体 ,而是 删除关系 .

是否应该对两个实体都进行删除?仅删除带有@Backlink 的实体?

我尝试了几种基于 .remove() + 的 put() ,但都没有成功。

@Entity()
class LocationModel {
  @Id()
  int localId = 0;

  @Unique(onConflict: ConflictStrategy.replace)
  int id;

  @Backlink('location')
  final items = ToMany<ItemModel>();

  final users = ToMany<UserModel>();
}


@Entity()
class UserModel {
  @Id()
  int localId = 0;

  @Unique(onConflict: ConflictStrategy.replace)
  String guid;

  @Backlink('user')
  final items = ToMany<ItemModel>();

  @Backlink()
  final locations = ToMany<LocationModel>();
}

一种方法来更新位置和用户之间的关系。用户是该位置的用户列表(由 API 提供)。目标是更新关系(并且只更新关系)。

这个想法也将是用用户集合中的方法做类似的事情来更新用户和位置列表。

 LocationModel updateUsers(
   LocationModel locationModel, 
   List<UserModel> users,
 ) {
    // Update users that may still have a link to this location
    final usersByLocation = userCollection.getByLocation(locationModel.localId);

    // Remove relationship with location if no users (users.isEmpty) or no longer present in users list
    final userToRemoveLocation = users.isEmpty
        ? usersByLocation
        : usersByLocation
            .where((user) => !users.any((u) => u.guid == user.guid))
            .toList();

    for (var user in userToRemoveLocation) {
      user.locations.remove(locationModel);
      userCollection.put(user);

      final locationInDb = locationBox.get(locationModel.localId);
      if (locationInDb != null) {
        locationInDb.users.remove(user);
        locationBox.put(locationInDb);
      }
    }

    // Creation of new relationships between location and users (users list)
    for (var user in users) {
      final userInDb = userCollection.getByServerId(user.guid);
      if (userInDb != null) {
        userInDb.locations.add(locationModel);
        userCollection.put(userInDb);

        final locationInDb = locationBox.get(locationModel.localId);
        if (locationInDb != null) {
          locationInDb.users.add(user);
          locationBox.put(locationInDb);
        }
      }
    }

    return locationModel;
  }
帖子版权声明 1、本帖标题:通过多对多链接管理实体之间的关系
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Lenard Kasselmann在本站《flutter》版块原创发布, 转载请注明出处!
最新回复 (0)
返回
作者最近主题: