Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 删除多对一关系的规则_Ios_Macos_Core Data - Fatal编程技术网

Ios 删除多对一关系的规则

Ios 删除多对一关系的规则,ios,macos,core-data,Ios,Macos,Core Data,苹果的文档记录简单明了。但它只讨论一对多关系(删除一对一关系的规则很容易推断)。目前尚不清楚这些规则对多对一关系意味着什么。让我们在这里澄清一下 我们使用苹果文档中使用的员工部门示例。虽然这些规则应用于员工与部门之间的关系可能会产生荒谬的现实意义,但作为程序员,我们在这里只讨论它们的逻辑意义 拒绝 如果关系目标处存在对象,则无法删除源对象 例如,如果要删除某个员工,无论其部门中是否还有其他员工,都必须确保先删除该部门,否则无法删除该员工 取消 从目标处对象的反向关系中删除源对象。(见@bshi

苹果的文档记录简单明了。但它只讨论一对多关系(删除一对一关系的规则很容易推断)。目前尚不清楚这些规则对多对一关系意味着什么。让我们在这里澄清一下

我们使用苹果文档中使用的员工部门示例。虽然这些规则应用于员工与部门之间的关系可能会产生荒谬的现实意义,但作为程序员,我们在这里只讨论它们的逻辑意义

  • 拒绝
    如果关系目标处存在对象,则无法删除源对象

    例如,如果要删除某个员工,无论其部门中是否还有其他员工,都必须确保先删除该部门,否则无法删除该员工

  • 取消
    从目标处对象的反向关系中删除源对象。(见@bshirley的简明解释)

    例如,如果删除员工,则将其从其部门的员工关系中删除。只有当部门剩余员工的数量大于所需的最低计数,或者确保在下一次保存操作之前为部门添加新员工时,这才有意义

    [问题:如果是最后一名员工,该部门的员工关系将变为空集还是空值?]
    (回答@TechZen:to-many关系始终返回一个set对象。它从不为零。如果关系的另一端没有对象,则set为空。)

  • 级联 删除关系目标处的对象

    例如,如果删除一名员工,则同时删除他的部门,即使该部门中还有其他员工

    使用注意事项:如@TechZen在其示例中所述,它通常会导致“整个对象图中出现菊花链删除”)

  • 不采取行动
    不对关系目标处的对象执行任何操作

    例如,如果您删除了一名员工,即使该部门仍然认为自己拥有该员工,也应保持其部门的原样


从这里可以推断出多对多关系的删除规则的含义。

这些是所有关系(而不是属性)的删除规则。它们适用于对一对多关系

  • Nullify-如果删除员工,则反向关系设置为nil,如果是1:1,则实际上,在本例中,部门的员工减少1

  • 级联-如果删除员工,其部门将被删除。部门将对其所有属性遵循删除规则,1)如果员工删除规则为级联,则此操作将删除所有员工;2) 如果员工删除规则无效,所有员工都将“搁浅”,没有部门


您似乎假设删除规则的行为在一对多和多对一之间发生了一些变化,但事实并非如此。每件事都是一样的。如果你想一想,它必须是这样的,因为一对多只是多对一的互惠关系

我认为这是一个互惠关系的想法,是绊倒了你在这里。关系的每一方都是单独定义的,并且都有自己的删除规则,可以不同于另一方的删除规则

让我们以通用标准部门和员工为例

Department{
  name:string
  employees<--(required,cascade)-->>Employee.department
}

Employee{
  name:string
  department<<--(required, nullify)-->Department.employee
  projects<--(optional,cascade)-->>Project.owner
}

Project{
  name:
  owner<<--(required,nullify)-->Employee.projects
}
部门{
名称:string
员工>员工部门
}
雇员{
名称:string
departmentProject.owner
}
计划{
姓名:
ownerEmployee关系。从部门的角度来看,部门对象必须至少有一名员工。如果只有一名员工,则无法删除该员工。如果删除部门对象本身,则同时删除其所有员工。从员工的角度来看,每个员工必须有一个de部门。任何为员工对象的部门值保存nil值的尝试都会引发验证错误。但是,如果删除员工对象,则部门对象除了失去其一个员工对象外,什么也不会发生。但是,如果员工对象是关系中唯一的员工对象,则部门对象将阻止删除

顾名思义,级联删除可以在整个对象图中引发一系列删除。删除部门对象时,它会删除其所有相关员工对象,而每个员工对象又会删除其所有项目对象

但如果在多对多关系的两侧都设置了级联删除规则,该怎么办

Alpha{
  betas<<--(cascade)-->>Beta.alphas
}

Beta{
  alphas<<--(cascade)-->>Alpha.betas
}
Alpha{
betasBeta.alphas
}
贝塔{
贝塔斯阿尔法鲑
}
在这种情况下,删除图形中的任何一个对象都将删除与任一关键路径相关的所有其他对象。删除一个Beta对象将删除其所有Alpha对象,这将依次删除其所有Beta对象,这将依次删除其所有Alpha对象…依此类推,直到删除所有可访问的相关对象

很明显,一个双面对多、层叠的关系是一个很好的打击自己的方式

总之:

  • 关系由每个实体在关系的两侧独立定义
  • 删除规则可以由可选性或最小计数覆盖
  • 了解关系的运行时行为需要结合删除规则、可选性和最小计数的效果
创建数据模型编辑器的一个原因是对r施加一些限制性逻辑