如何重构核心数据模型以使两个现有实体从新的抽象实体inheritance

有了这个版本的iPhone应用程序,我正在尝试创建一个新的核心数据模型版本,其中我正在使用两个现有实体并将其更改为从一个全新的抽象实体inheritance。 我还试图将这些实体中的几个共享属性移动到新的抽象实体上。

当我在应用程序的现有版本上运行时,我得到一个NSInternalInconsistencyException

 Cannot merge multiple root entity source tables into one destination entity root table 

直到这个版本的应用程序,我已经离开了“轻量级”迁移。 这个例外意味着我需要创建一个映射模型吗?

我已经解决了这个问题。 我将在这里详述,以便其他人可以将其用作资源。 我并不完全确定核心数据的内部工作原理,但在尝试创建一个新的抽象实体并将两个现有实体合并到其中时似乎会窒息。 因此,我提出的解决方案是抛弃旧实体并创建3个全新实体并创建映射模型,以将旧实体中的数据映射到新实体。

给定以下需要从新抽象实体inheritance的实体。

  • Snake
  • Mouse

第1步 – 创建新的模型版本

创建新的模型版本并创建3个新实体。 删除旧的。 我为新实体使用了不同的名称。 我不确定是否有办法通过保持名称相同来实现这一目标。

  • Serpent (取代蛇)
  • Rodent (取代鼠标)
  • Animal (其他两个将用作父母的新抽象实体)

注意:可以在模型设计器视图中复制和粘贴属性和关系。 您可以在实体之间甚至跨模型版本复制它们。 只需从设计器视图中的属性列表中选择属性,然后选择⌘-C即可。 将属性从旧实体移动到新的抽象实体时,这可以节省大量时间。

第2步 – 创建映射模型

使用xcode 创建映射模型 。 在创建对话框中,选择以前的模型版本作为源,将新模型版本作为目标。 映射模型包含实体映射列表。 Xcode应该为旧模型版本中的每个实体自动创建一个。 它们遵循OldEntityToNewEntity的命名模式。 尚未创建任何新实体,因此您必须添加它们:

  • SnakeToSerpent
  • MouseToRodent

    (不要为抽象的Animal实体制作一个)。

在每个新映射的属性检查器中,选择旧实体作为源,将新实体作为目标。

第3步 – 映射属性

应该已经存在每个实体映射中的一些属性和关系。 应该已经自动检测并正确设置了旧实体和新实体中具有相同名称的任何属性。 您必须为已移动到抽象实体的任何属性添加属性映射。 (与关系和获取的属性相同)只需引用旧的模型版本,以确保包含计划继续使用的所有属性。

那应该是它。

为了确保人们正确地做到这一点,我遵循Christian Schlensker给出的指示,包括“不要为抽象的Animal实体制作一个”和(继续他的例子),而它建立并运行时没有原始的“不能合并”错误,我的Serpent和Rodent在内省时未被认为是Animal的子类。

为了正确迁移,我必须创建SnakeToAnimal和MouseToAnimal映射,这些映射将适当的属性从子类映射到超类。

这可能是克里斯蒂安在第3步中得到的结论,但鉴于他之前的评论“不要为抽象的动物实体制作一个”,我并不完全清楚,因为这正是我必须要做的。