Lets say you have the classic Manager <- Department(s) ->> Employee data model. Where the Manager inherits from the Employee entity which inherits from the Person entity.
If I have a Department, with a Manager and a set of Employees, how can I programmatically represent the Manager losing their job and being demoted to just an Employee, and one of the employees being promoted to the Manager?
In Core Data parlance, I want to take a Managed Object and change its entity, although keep it as a subclass of Person. Is there a smart way to do this? Or will I have to write methods to promote an Employee and demote a Manager like this:
+ (Employee *)demoteManager:(Manager *)manager {
// Get the context
NSManagedObjectContext *context = [manager managedObjectContext];
// Create a new employee object (mogenerator style)
Employee *employee = [Employee insertIntoManageObjectContext:context];
// Set attributes etc
employee.name = self.name;
// Set relationships etc
Department *dept = manager.manages;
[dept addEmployeesObject:employee];
employee.department = dept;
dept.manager = nil;
manager.manages = nil;
// Delete manager
[context deleteObject:manager];
// Save
NSError *error = nil;
[context save:&error];
return employee;
}
etc? And I realise that I should just put a boolean flag on Employee (isManager), but this is a contrived example for this question, in reality I don’t want to use a flag.
So, if some Core Data wizards have done this already or know a better way, I’d love to hear!
Cheers,
There is no way to change an entity like you are describing. You would need to create a new employee, copy the manager’s data to that employee record and create a new manager for the promoted employee.
However, as Christian suggested, it would be better if your manager was also an employee. You mentioned additional data that is manager specific. Perhaps you could put this into a third table that has a relationship to a specific employee. Then any employee that is also a manager will have data stored in this auxiliary table. Far less painful than destroying and creating objects just to promote or demote a manager.