外部キーによる削除動作の設定
外部キー関係の一方の側のエンティティが削除される際、関係の反対側のエンティティの動作を指定する必要があります。これにより、参照整合性が維持され、ビジネスロジックに基づく任意の決定に従います。
削除動作は、データシェイプ用のデータベース情報で指定され、外部キーが指定されるのと同じ配列で指定されます。削除動作 (存在する場合) は、個々の外部キーごとに指定されます。詳細については、外部キーの追加または除去を参照してください。
次の説明では、A は外部キーを持つエンティティであり、B は外部キーによって参照されるフィールドを持つエンティティです。
onDelete - B が削除されるときの、A の動作を決定します。
CASCADE - B が削除されると A も削除されます。これはカスケード削除と呼ばれます。
SET_NULL - B が削除されるときに、A の外部キーフィールドの値は Null に設定されます。
onDelete が指定されていない場合、B が削除されても A には何も起こりません。
deleteReference - A が削除されるときの、B の動作を決定します。
true の場合、A が削除されると B も削除されます。
false の場合または指定されていない場合、A が削除されても B には何も起こりません。
たとえば、繰り返しカレンダー日 (PTC.Shift.CalendarDayRepeating) は、カレンダーとシフトスケジュールの関係です。これは、カレンダー (CalendarUID) の UID とシフトスケジュール (ShiftScheduleUID) の UID を参照する外部キーフィールドで、繰り返しカレンダー日に定義されます。次のコードは、PTC.ShiftImpl.Manager Thing 上の GetDBInfo サービスで、繰り返しカレンダー日データシェイプ (PTC.Shift.CalendarDayRepeating) 用に指定されたデータベース情報からのものです。
foreignKeys: [{
name: "calendarUid",
referenceDataShapeName: "PTC.Shift.Calendar",
referenceFieldName: "uid",
onDelete: "CASCADE"
}, {
name: "shiftScheduleUid",
referenceDataShapeName: "PTC.Shift.ShiftSchedule",
referenceFieldName: "uid",
deleteReference: true
}, {
name: "siteUid",
referenceDataShapeName: "PTC.MfgModel.Site",
referenceFieldName: "uid"
}]
両方の外部キーに対して onDeleteCASCADE に設定されているため、いずれかの参照作業定義が削除されると、作業定義リンクも削除されます。これにより参照整合性を確保します。作業定義リンクは、関係の両側に作業定義がなければ存在できません。
ChildUID フィールドで外部キーに対して deleteReference が true に設定されているため、作業定義リンクが削除されると、ChildUID フィールドによって参照される作業定義も削除されます。この動作は、親と子作業定義の間のリンクが削除される場合に、子作業定義も削除する必要があることを指定している、ビジネス上の判断によって決定されます。
* 
データベーススキーマに新規データシェイプまたは外部キーを追加するには、データベースと同期化する前に、削除動作を指定する必要はありません。最良事例として、外部キー関係の一方の側でデータシェイプのインスタンスが削除される前に、削除動作を指定する必要があります。
各外部キーに対する onDeletedeleteReference の設定を満たす一方で、削除を行うために使用されるサービスは、データベース管理 Thing Shape (PTC.DBConnection.DBManagementThingShape) にあります。これらのサービスは、BatchCascadeDeleteCascadeDelete、および CollectActionForCascadeDelete です。すべてのマネージャはこの Thing Shape から拡張するため、これらのサービスを継承します。詳細については、データベース管理 Thing Shape のサービスを参照してください。
DeleteShiftDeleteJobOrder などの、個々のデータモデルオブジェクトに対する標準の削除操作は、指定されたエンティティのみを削除します。そのエンティティのみを削除することで参照整合性に違反すると、そのサービスは失敗します。そのような場合は、カスケード削除サービスを使用します。この例外は、CascadeDeleteModel サービスを呼び出す PTC.MfgModelImpl.Manager Thing 上の DeleteSite サービスです。
これは役に立ちましたか?