一对多删除对象不删除多个实体上的对象

Posted

技术标签:

【中文标题】一对多删除对象不删除多个实体上的对象【英文标题】:One to Many remove Object not deleting object on many entity 【发布时间】:2015-06-07 18:13:25 【问题描述】:

我有一个名为Activity(一个)和Game(多个)的实体。我将删除规则设置为级联,用于Activity 实体上的“游戏”关系,并为游戏实体上的“活动”关系设置 Nullify(稍后会详细介绍)。

如果我删除一个Activity 对象,那么所有Game 对象也会从核心数据中删除。因此,这种关系的级联规则似乎运行良好。

现在,如果我使用提供的任一方法删除多个“游戏”对象中的一个或全部:removeGameObject: 和 removeGame:,则 Activity 对象将不再链接到任何 Game 对象.所以这似乎奏效了。但是在对“游戏”实体进行独立查询时,那些应该被删除的游戏对象仍然在核心数据中。它们不仅仅是链接到任何Activity 对象。

***我也尝试过No Action,Cascade删除规则。

我可以手动移除游戏对象。但必须有正确的方法来做到这一点。

任何指针?

@class Game;

@interface Activity : NSManagedObject

@property (nonatomic, retain) NSNumber * activityID;
@property (nonatomic, retain) NSString * activityType;
@property (nonatomic, retain) NSSet *game;
@end

@interface Activity (CoreDataGeneratedAccessors)

- (void)addGameObject:(Game *)value;
- (void)removeGameObject:(Game *)value;
- (void)addGame:(NSSet *)values;
- (void)removeGame:(NSSet *)values;

@end

@class Activity;

@interface Game : NSManagedObject

@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) Activity *activity;

@end

【问题讨论】:

【参考方案1】:

removeGameremoveGameObjectActivity 实体上的方法,那么您为什么认为它们会删除Game 对象呢?他们完全按照他们所说的去做,从这个Activity 中删除Game - 删除引用,但他们实际上并没有删除Game 对象。这些方法在您有一对多而不是一对一关系时更有用,因为它们允许您轻松地从关系中删除特定对象。

如果要删除 Game 实体,则需要在 NSManagedObjectContext 实例上调用 deleteObject: 方法,指定要删除的 Game。如果您执行此操作并且您已将删除规则设置为 Nullify 上从 GameActivity 的反向关系,那么对 Game 的引用将从 Activity 中删除。

【讨论】:

以上是关于一对多删除对象不删除多个实体上的对象的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net 如何使用实体框架删除一对多的对象

删除与基于视图的实体具有一对多关联的实体对象

EclipseLink 不删除私有的一对多项目

iOS:删除核心数据中具有一对多关系的实体

核心数据:删除最后一个具有一对多关系的实体

更新一对多关系后删除孤儿