如何在不复制目标 NSManagedObject 的情况下将目标 NSManagedObject 添加到另一个具有反向多对多核心数据关系的对象?

How to Add target NSManagedObject to another one with an inverse many-to-many Core Data relationship without duplicating target NSManagedObject?

我在我的一个项目中遇到了一个问题,我花了几十个小时来寻找解决方案,我取得了一些进展,但仍然没有达到我想要达到的理想状态。我现在仍在寻找解决方案,但我真的很感激任何人都可以分享任何关于建设性解决方案的见解。

问题:

注:

我现在拥有的:

我想达到什么目的:

我试过的:

我现在得到的是:

我的问题:

我认为解决问题的方向:

非常感谢您花时间查看它,期待您的见解。非常感谢。

此致,

骑士

你需要稍微改造一下数据:去掉RecipeIngredient的多对多关系,换成中间实体(找个好名字很难,比方说RecipeIngredientDetails).

创建一个从 RecipeRecipeIngredientDetails 的一对多关系,比如 allUsedIngredientDetails,反向(一对一)recipe

同样创建一个从 IngredientRecipeIngredientDetails 的一对多关系,比如 allHostRecipeDetails,反向(一对一)ingredient

这解决了直接多对多关系的问题,其中每个 Recipe 只能与每个 Ingredient 相关一次。 (你是对的,这部分是因为关系被建模为集合,不能有重复的成员)。您有两个选择:您可以只添加多个 RecipeIngredientDetails 对象,每个对象都与相同的 RecipeIngredient 对相关。每个这样的对象可能代表成分的标准基本数量。请注意,每个 Recipe/Ingredient 对不能只有一个对象,并尝试多次将该对象添加到同一个 Recipe:一个给定的 Recipe 和一个给定 RecipeIngredientDetails 个对象最多可以关联一次。

但是向 RecipeIngredientDetails 添加一个属性可能会更好,比如 quantity。然后,每个 Recipe/Ingredient 对只需要一个这样的对象,并且可以更新 quantity 属性以反映适合该食谱的配料量。

这是 Modeling a Relationship Based on Its Semantics 上的 CoreData 编程指南部分中提到的方法:

For this sort of relationship, use an intermediate (join) entity. An advantage of the intermediate entity is that you can also use it to add more information to the relationship.

相当于在SQL 数据库中添加一个带有外键和附加列的连接table。我不知道有任何更简单的方法可以在 CoreData 中实现您的目标 - 无法直接向关系添加属性。

关于您在评论中提到的排序问题,您已添加"a Double type attribute in the Entity to keep track of the order"。如果您只有两个实体和多对多关系,并且将顺序属性添加到 Ingredient,那么(例如)如果 "Flour" 是 "Bread" 的第一个成分,它必须是使用它的每个其他食谱的第一项。在我描述的方法中,您可以将属性添加到中间实体,RecipeIngredientDetails:索引(就像数量一样)取决于 配方和原料。

然而,对于索引,我应该提到另一个选项:您可以(在数据模型编辑器中)将 Recipe 到 RecipeIngredientDetails 的关系定义为 ordered .生成的 属性 将是一个有序集(因此您可以插入、删除或移动项目以实现正确的顺序)。