2011-03-07 10 views
2

古典的なマネージャ< - Department(s) - >> Employeeデータモデルがあるとします。マネージャは、Personエンティティから継承したEmployeeエンティティから継承します。コアデータ:一般的な属性を維持しながらオブジェクトのエンティティを動的に変更する方法

マネージャーと従業員のセットがある部門がある場合、マネージャーに職務を喪失し、従業員だけに降格されたマネージャーと、昇格された従業員の1人をプログラムで表すことはできますか?

コアデータの言い回しでは、私は管理対象オブジェクトを取得し、そのエンティティを変更したいが、それをPersonのサブクラスとして保持したい。これを行うにはスマートな方法がありますか?

+ (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; 
} 

など:または私はこのようなマネージャーを従業員を促進し、降格する方法を記述する必要がありますか?そして、私はEmployee(isManager)にブール値のフラグを付けるだけでよいことを認識していますが、これは実際にはフラグを使用したくないというこの疑問のために考案された例です。

コアデータウィザードで既にこれを行っていたり、より良い方法を知っていれば、聞いてみたいと思います!

乾杯、

答えて

2

説明しているようにエンティティを変更する方法はありません。新しい従業員を作成し、その従業員レコードにマネージャのデータをコピーし、昇格した従業員のために新しいマネージャを作成する必要があります。

しかし、クリスチャンが示唆しているように、あなたのマネージャーが従業員であった場合は、それが良いでしょう。マネージャ固有の追加データについて述べました。おそらく、これを特定の従業員との関係を持つ第3のテーブルに入れることができます。マネージャでもある従業員は、この補助表にデータを格納します。マネージャーの昇進や降格のためにオブジェクトを破壊して作成するよりも痛みが少なくなります。

+0

それは実際には悪い考えではありません(1対1の関係で別のエンティティに「マネージャ」の特定のものを置く)。現時点では、Employeeエンティティの説明のpropertyByNameキーに対してforループを作成/削除し、forループを実行することによって、昇格と降格の2つのメソッドがManager上にあります。大丈夫だと思う。 –

1

あなたはコアデータ、私の知る限りでは、エンティティの種類を変更することはできません。

ManagerEmployeeの違いは何ですか? ManagerEmployeeではありませんか? ManagerはロールManagerEmployeeではありませんか?私の理解のために

私はこのようにそれをモデル化します:

部門(S) - >>従業員を

Departmentは1だ属性managerあります。従業員が何であるかを定義する、Employeeから1の関係をマネージャー。

+0

元々、私のマネージャオブジェクトは存在せず、従業員だけです。しかし今は、従業員ではなく、Manager上に他の多くのプロパティを定義する必要があります。したがって、実際にはサブエンティティである必要があります。とにかく、マネージャー/部署/従業員の詳細でうまくいきたいとは思っていません。それは単なる例です。しかし、私はあなたが正しいと思うし、その場でエンティティを変更することはできません。 –

関連する問題