您是否需要保存 ManagedObjectContext 以使 Nullify 删除规则影响目标实体?

Do you need to save ManagedObjectContext in order for a Nullify delete rule to affect destination entity?

我正在使用核心数据将 chessGames 和 chessPlayers 保存到数据库中。 - 每个 chessGame 与白人玩家和黑人玩家都有一对一的关系(删除规则设置为无效)。 - 每个玩家与 gamesAsWhite 和 gamesAsBlack 都有一对多的关系(删除规则设置为拒绝)。

每当我删除一个 chessGame 时,如果玩家没有参与任何其他游戏,我也会尝试删除参与该游戏的玩家。如下代码所示。

用于删除国际象棋游戏和潜在玩家的代码:

context.perform {
                //deletes associated chessgameSnapShot
                context.delete(chessGameMO)
                CoreDataUtilities.save(context: context)
                //delete rule set to deny
                //player only deleted if it is not involved in any games
                whitePlayer.deleteIfNotInvolvedInAnyGames(inManagedObjectContext: context)
                blackPlayer.deleteIfNotInvolvedInAnyGames(inManagedObjectContext: context)
                CoreDataUtilities.save(context: context)
            }

deleteIfNotInvolvedInAnyGames 的实现:

func deleteIfNotInvolvedInAnyGames(inManagedObjectContext context:NSManagedObjectContext){
        guard let gamesAsBlack =  self.gamesAsBlack as? Set<ChessGameMO>,
            let gamesAsWhite =  self.gamesAsWhite as? Set<ChessGameMO> else {return}
        let gamesInvolvedIn = gamesAsWhite.union(gamesAsBlack)
        if gamesInvolvedIn.isEmpty {
            context.delete(self)
        }
    }

仅当我在删除 chessGame 后保存上下文时,代码才有效。如果我删除第一个 CoreDataUtilities.save(context: context),那么 whitePlayer(和 blackPlayer)永远不会在 deleteIfNotInvolvedInAnyGames 中被删除,因为与 chessGameMO 的关系似乎没有尚未作废。

这是正常行为吗?在保存上下文之前,不应该更新 NSManagedObjects(在内存中)之间的关系吗?

您的初步理解是正确的 - 验证仅在保存时发生。因此,如果您删除了游戏和播放器,然后保存,假设所有更改都有效,它应该可以工作。 但是 关系 在保存之前不会更新。关系仍然存在,它只是指向一个已删除的对象(object.isDeleted)。所以你在 deleteIfNotInvolvedInAnyGames 中的代码必须过滤掉所有已删除的对象,然后查看集合是否为空。