Я не думаю, что первое, что вы цитировали, это ваша проблема. Ссылка на company.employees не является запросом на выборку.
Я подозреваю, что это может быть связано с обратными отношениями. Есть ли у вас партнерская компания на сотрудника, что противоположно Company.employees?
Затем, когда вы назначаете генерального директора в такую компанию:
ceo.company = company;
Тогда за кулисами Core Data говорит, что генеральный директор - сотрудник. Когда вы назначаете компанию Сотруднику, присваивайте обратную связь. Назначьте Сотрудника сотрудникам компании. Создает эффект следующего кода автоматически:
[company addEmployeesObject:ceo];
На мой взгляд, обратные отношения раздражают в базовых данных. Много раз ваш код не нуждается в них, но они почти необходимы внутренней работе Core Data. Дайте мне знать, если это окажется вашей проблемой, и я мог бы предложить обходной путь.
EDIT:
Поведение во втором прогоне вашего примера «родитель-ребенок» - то, чего я ожидал.
Вы назначаете
fam.child = child
Обратное отношение Family.child - Child.family, поэтому Базовые данные генерируют присваивание
child.family = fam
Ребенок наследует от Родителя. Обратное отношение Parent.family - Family.parent, поэтому обратное отношение Child.family - также Family.parent. Поэтому Core Data генерирует вставку
[fam addParentsObject:child]
Чего я не ожидал, так это результатов первого запуска. Если дочерний элемент добавлен к родителям, он должен быть добавлен в контексте управляемого объекта и должен быть виден немедленно.
Возможно, вы можете назвать это ошибкой, но в любом случае ошибочное поведение на самом деле то, что вы хотите. Чего вы не хотите, так это того, что происходит во втором запуске, что на самом деле является «правильным» поведением. На самом деле, поведение на самом деле не определено, потому что вы создали несогласованную модель данных. Фактически вы сказали
Обратное значение A.b - B.a
Обратное значение B.a - A.c
Инверсии на самом деле не инверсии. Я думаю, вы найдете предупреждение об этом при сборке.
Ладно, как решить исходную проблему?
Мое первое предложение - вы не заставляете генерального директора наследовать от сотрудника. Но если у вас есть причины, по которым вы хотите это сделать, то вот как это сделать.
Базовые данные требуют, чтобы вы определили обратные и чтобы обратные правила следовали правилам базовых данных. Если вы не хотите следовать правилам Core Data, тогда определяйте обратные правила в соответствии с правилами Core Data, но не используйте их. Определите вашу модель данных следующим образом:
Company
employees: (to-many) Employee - inverse isEmployeeOf
ceo: (to-one) CEO - inverse isCEOOf
// unused
people: (to-many) Employee - inverse company
Employee
company: (to-one) Company - inverse people
// unused
isEmployeeOf: (to-one) Company - inverse employees
CEO : Employee
// unused
isCEOOf: (to-one) Company - inverse ceo
Теперь создайте компанию myCompany с одним сотрудником mrEmployee и одним генеральным директором mrCEO. Возможно, вам придется установить некоторые дополнительные параметры вручную, поскольку для используемых вами свойств не определены обратные значения.
[myCompany addEmployeesObject:mrEmployee];
mrEmployee.company = myCompany; // not automatic, because not official inverse
myCompany.ceo = mrCEO;
mrCEO.company = myCompany;
Тогда они будут иметь следующие отношения:
myCompany
employees - {mrEmployee}
ceo - mrCEO
people - {mrEmployee, mrCEO}
mrEmployee
company - myCompany
isEmployeeOf - myCompany
mrCEO
company - myCompany
isEmployeeOf - myCompany
isCEOOf - myCompany