Как провести рефакторинг базовой модели данных, чтобы две существующие сущности наследовали от новой абстрактной сущности - PullRequest
11 голосов
/ 24 ноября 2011

В этой версии приложения для iPhone я пытаюсь создать новую версию модели данных ядра, в которой я беру две существующие сущности и изменяю их для наследования от новой абстрактной сущности. Я также пытаюсь переместить несколько общих свойств из этих сущностей в новую абстрактную сущность.

Когда я запускаю существующую версию приложения, я получаю NSInternalInconsistencyException

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

Вплоть до этой версии приложения мне не удавалось с "облегченной" миграцией. Означает ли это исключение, что мне нужно будет создать модель сопоставления?

Ответы [ 2 ]

26 голосов
/ 28 ноября 2011

Я решил проблему. Я собираюсь быть подробно здесь, чтобы другие люди могли использовать это как ресурс. Я не совсем уверен во внутренней работе основных данных, но, похоже, он задыхается при попытке создать новую абстрактную сущность и объединить в нее две существующие сущности. Таким образом, решение, которое я придумал, состояло в том, чтобы отбросить старые сущности, создать 3 совершенно новых и создать модель отображения, чтобы отобразить данные из старых сущностей в новые.

Учитывая следующие сущности, которые должны наследоваться от новой абстрактной сущности.

  • Snake
  • Mouse

Шаг 1 - создать новую версию модели

Создайте новую версию модели и создайте 3 новых объекта. Удалить старые. Я использовал разные имена для новых лиц. Я не уверен, есть ли способ сделать это, сохранив имена одинаковыми.

  • Serpent (заменяет змея)
  • Rodent (заменяет мышь)
  • Animal (новая абстрактная сущность, которую два других будут использовать в качестве родителя)

Примечание: можно копировать и вставлять свойства и связи в представлении конструктора моделей. Вы можете скопировать их между сущностями и даже между версиями модели. Просто выберите свойства из списка свойств в представлении конструктора и нажмите C-C. Это значительно экономит время при переносе свойств из старых сущностей в новую абстрактную.

Шаг 2 - Создание модели сопоставления

Используйте Xcode, чтобы создать модель сопоставления . В диалоговом окне создания выберите предыдущую версию модели в качестве источника и новую версию модели в качестве места назначения. Модель сопоставления содержит список сопоставлений сущностей. XCode должен был автоматически создать один для каждого из объектов в вашей старой версии модели. Они следуют шаблону именования OldEntityToNewEntity. Ни одна из новых сущностей еще не была создана, поэтому вы должны добавить их:

  • SnakeToSerpent
  • MouseToRodent

    (не делайте его для абстрактного животного).

В инспекторе свойств для каждого из новых сопоставлений выберите старую сущность в качестве источника и новую в качестве места назначения.

Шаг 3 - сопоставить свойства

Некоторые свойства и отношения в каждом сопоставлении сущностей уже должны присутствовать. Любое свойство, имеющее одинаковое имя как в старом, так и в новом объекте, должно быть автоматически обнаружено и правильно настроено. Вам нужно будет добавить сопоставление свойств для любого свойства, которое было перемещено в абстрактную сущность. (то же самое с отношениями и извлеченными свойствами). Просто сверьтесь со своей старой версией модели, чтобы убедиться, что вы включили все свойства, которые вы планируете продолжать использовать.

Так и должно быть.

2 голосов
/ 13 августа 2013

Просто чтобы убедиться, что люди делают это правильно, я следовал инструкциям, данным Кристианом Шленскером, в том числе «не делайте таковых для абстрактного животного» и (чтобы продолжить его пример), пока он строил и работал без оригинала »Ошибка «невозможно объединить», мой змей и грызун не были распознаны как подклассы животных при самоанализе.

Для правильной миграции я сделал должен создать отображения SnakeToAnimal и MouseToAnimal, которые отображали соответствующие свойства из подкласса в суперкласс.

Это может быть то, что Кристиан получал вс шагом 3, но мне было не совсем понятно, учитывая его комментарий «не делайте один для абстрактной сущности Животного» ранее, так как это именно то, что я должен был сделать.

...