Cómo refactorizar un model de datos central para hacer que dos entidades existentes henetworkingen de una nueva entidad abstracta

Con esta versión de una aplicación de iPhone, estoy intentando crear una nueva versión del model de datos básicos en la que tomo dos entidades existentes y las cambio para henetworkingar de una nueva entidad abstracta. También estoy intentando mover varias de las properties compartidas de estas entidades a la nueva entidad abstracta.

Cuando ejecuto una versión existente de la aplicación obtengo una NSInternalInconsistencyException

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

Hasta esta versión de la aplicación, he salido con la migration "liviana". ¿Esta exception significa que necesitaré crear un model de mapeo?

He resuelto el problema. Voy a ser detallado aquí para que otras personas puedan usar esto como recurso. No estoy completamente seguro sobre el funcionamiento interno de los datos centrales, pero pareció asfixiarse al intentar crear una nueva entidad abstracta y hacer que dos entidades existentes se fusionen en ella. Entonces, la solución que se me ocurrió fue abandonar las antiguas entidades y crear 3 nuevas, y crear un model de mapeo para asignar datos de las antiguas entidades a las nuevas.

Dadas las siguientes entidades que deben henetworkingar de una nueva entidad abstracta.

  • Snake
  • Mouse

Paso 1: cree una nueva versión del model.

Cree una nueva versión de model y cree 3 nuevas entidades. Eliminar los anteriores. Utilicé diferentes nombres para las nuevas entidades. No estoy seguro si hay una manera de lograr esto manteniendo los nombres iguales.

  • Serpent (reemplaza serpiente)
  • Rodent (reemplaza al mouse)
  • Animal (nueva entidad abstracta que los otros dos usarán como padre)

Nota: es posible copyr y pegar properties y relaciones en la vista del diseñador del model. Puede copyrlos entre entidades e incluso en versiones de models. Simplemente select las properties de la list de properties en la vista de diseñador y ⌘-C. Este es un gran ahorro de time al mover properties de las entidades antiguas al nuevo resumen.

Paso 2: crea un model de mapeo

Use xcode para crear un model de mapeo . En el cuadro de dialog de creación, select la versión del model anterior como origen y la nueva versión del model como destino. El model de mapeo contiene una list de mapeos de entidades. Xcode debería haber creado automáticamente uno para cada una de las entidades en su versión de model anterior. Siguen el patrón de denominación de OldEntityToNewEntity. Ninguna de las nuevas entidades se habrá creado aún, así que debes agregarlas:

  • SnakeToSerpent
  • MouseToRodent

    (no crea uno para la entidad animal abstracta).

En el inspector de properties para cada una de las asignaciones nuevas, select la entidad antigua como fuente y la nueva como destino.

Paso 3: mapea las properties

Algunas de las properties y relaciones en cada asignación de entidad ya deberían estar presentes. Cualquier propiedad que tenga el mismo nombre tanto en la entidad antigua como en la nueva debería haberse detectado automáticamente y configurado correctamente. Tendrá que agregar una asignación de propiedad para cualquier propiedad que se movió a la entidad abstracta. (lo mismo con las relaciones y las properties buscadas) Simplemente haga reference a su versión de model anterior para asegurarse de include todas las properties que planea seguir usando.

Eso debería serlo.

Para asegurarme de que las personas hacen esto correctamente, seguí las instrucciones dadas por Christian Schlensker que incluyen "no hacer una para la entidad animal abstracta" y (para continuar su ejemplo), mientras que se construyó y ejecutó sin el "No se puede fusionar" original error, mi Serpiente y Roedor no fueron reconocidos como subclasss de Animal en la introspección.

Para poder migrar correctamente, tuve que crear asignaciones SnakeToAnimal y MouseToAnimal que mapearon las properties apropiadas de la subclass a la superclass.

Esto puede ser a lo que Christian se estaba dirigiendo con el Paso 3, pero no estaba del todo claro para mí dado su comentario "no hagas uno para la entidad Animal abstracta" anteriormente, ya que esto es exactamente lo que tenía que hacer.