Как реорганизовать базовую модель данных, чтобы две существующие сущности наследовали от нового абстрактного объекта

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

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

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

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

Ответ 1

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

Учитывая следующие объекты, которые необходимо наследовать от нового абстрактного объекта.

  • Snake
  • Mouse

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

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

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

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

Шаг 2 - Создание модели отображения

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

  • SnakeToSerpent
  • MouseToRodent

    (не делайте одно для абстрактного объекта Animal).

В инспекторе свойств для каждого из новых сопоставлений выберите старый объект как источник, а новый - в качестве адресата.

Шаг 3 - отобразите свойства

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

Это должно быть.

Ответ 2

Чтобы убедиться, что люди делают это правильно, я следовал инструкциям, данным Christian Schlensker, в том числе: "Не делайте одно для абстрактного существа Animal" и (чтобы продолжить его пример), в то время как он был построен и работал без оригинального "Невозможно объединить" ошибку, мой Змей и Грызун не были признаны подклассами Animal на интроспекции.

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

Это может быть то, к чему христианин шел с Шагом 3, но мне было не совсем ясно, что его комментарий "не делайте одно для абстрактного существа Animal" ранее, так как это именно то, что я должен был сделать.