设置外键的删除行为
当删除外键关系中任意一方的实体时,必须指定该关系中另一方实体所发生的情况。这样可确保参考的完整性得以保持,同时遵循基于业务逻辑所做出的任何决策。
删除行为于数据形状的数据库信息中指定,且位于指定
外键的同一数组中。删除行为 (如果存在) 将针对每个单独的外键指定。在以下说明中,A 是具有外键的实体,B 是具有外键所参考字段的实体。
• onDelete - 确定删除 B 时 A 所发生的情况。
◦ CASCADE - 在删除 B 的同时也会删除 A。这一行为被称作级联删除。
◦ SET_NULL - 删除 B 时,将 A 的外键字段值设置为空。
◦ 如果未指定 onDelete,则在删除 B 时,A 将保持不变。
• deleteReference - 确定删除 A 时 B 所发生的情况。
◦ 如果设置成 true,则在删除 A 的同时也会删除 B。
◦ 如果设置成 false 或未予指定,则在删除 A 时,B 将保持不变。
例如,
工作定义链接为父项工作定义与子项工作定义之间的关系。这一定义的依据为工作定义链接的外键字段引用了两个工作定义的 UID (
ParentUID 和
ChildUID)。以下代码源自为
PTC.SCA.SCO.DefaultProductionOrderManager 上的
GetWorkDefinitionDBInfo 服务内的工作定义链接数据形状 (
PTC.SCA.SCO.WorkDefinitionLink) 所指定的数据库信息。
"foreignKeys": [{
"name": "ChildUID",
"referenceDataShapeName": "PTC.SCA.SCO.WorkDefinition",
"referenceFieldName": "UID",
"onDelete": "CASCADE",
"deleteReference": true
}, {
"name": "ParentUID",
"referenceDataShapeName": "PTC.SCA.SCO.WorkDefinition",
"referenceFieldName": "UID",
"onDelete": "CASCADE"
}]
由于这两个外键的 onDelete 均设置成了 CASCADE,因此在删除其中一个所引用工作定义的同时,也会删除工作定义链接。这样可确保参考的完整性;工作定义链接存在的前提是该关系的每一方均具有工作定义。
由于 ChildUID 字段上外键的 deleteReference 被设置为 true,因此在删除工作定义链接时,也会删除 ChildUID 字段所引用的工作定义。此行为由以下业务决策确定:如果父项和子项工作定义间的链接被删除,则必须同时删除子项工作定义。
|
在
与数据库同步前,无需指定删除行为即可将新的数据形状或外键添加至数据库架构。最佳做法是:应在删除外键关系任意一方的任何数据形状实例前指定删除行为。
|
数据库管理事物形态 (
PTC.SCA.SCO.DBManagementThingShape) 中提供了用于执行删除,同时遵守每个外键的
onDelete 和
deleteReference 设置的服务。这些服务包括
BatchCascadeDelete、
CascadeDelete 和
CollectActionForCascadeDelete。所有管理器均派生自此事物形态,因此它们继承了上述服务。有关详细信息,请参阅
数据库管理事物形态服务。
Operator Advisor 数据模型 (
工作定义相关文档和
工作定义插图) 也引用 ThingWorx 文件信息库中存储的文件。作业单管理器事物模板 (
PTC.SCA.SCO.JobOrderManagerThingTemplate) 的
BatchCascadeDelete 服务已改写,使得当引用这些文件的实体被删除时,所引用的文件也从文件信息库中删除。
针对各个数据模型对象的标准删除操作,例如 DeleteShift 或 DeleteJobOrder,仅删除指定的实体。如果仅删除指定实体违背了参考完整性,则服务将失败。在这种情况下,请使用级联删除服务。