【问题标题】:Don't delete object of destination if it is in another Source in Coredata如果目标对象位于 Coredata 的另一个源中,请不要删除它
【发布时间】:2016-03-31 14:55:37
【问题描述】:

我有一个多对多的关系,其中entityEmployeeDepartment。一切都很顺利,但是当我尝试学习关系删除规则时,我找不到正确的方法。

如果实体部门被删除,我想删除该部门的所有员工。但不是那些在另一个部门的员工。

级联删除关系目标处的对象。为了 例如,如果您删除一个部门,则解雇该部门的所有员工 同一部门。

但是如果员工已经在另一个部门,我不想删除他们。一位老师教Swift可能在许多部门“计算机”,“电气”,“民事”。我怎样才能做到这一点..试过使用级联,但这会删除我设置的所有员工,如下所示:

编辑: 尝试使用 nullify 但删除 Source 会导致删除所有相关的 Destination。但是,删除任何一个 Source 只会导致 Destination 忘记那个特定的 Source。我想,我需要一些中间的 nullify 和 cascade 吗?

【问题讨论】:

    标签: ios swift core-data entity-relationship cascade


    【解决方案1】:

    以下关系将按照我的想法进行(我没有能力在这里测试答案,但无权仅发表评论以便您获得建议作为答案)

    Employee -> Department Deny(不能解雇仍分配给某个部门的员工)。

    部门 -> 员工级联(解雇所有在部门被删除时可以解雇的员工,即不再有部门)。

    但在我看来,将 Department -> Employee 设置为 Nullify 似乎更合理,然后单独扫描未分配的员工以在删除部门代码之外解雇。这还将支持对已删除所有任务的员工进行常规维护检查。

    【讨论】:

    • Deny 表示在仍有连接时不允许删除。因此,您可以预期已删除部门中仍分配给其他部门的每个员工 1 次删除失败。
    • 经过数小时的研究后,我在 SO 上发现了相同的逻辑,正如我所说,这是一种很酷的思考方式,但不是确切的解决方案
    【解决方案2】:

    在我的情况下,我不应该将删除关系设置为级联。而是将删除规则都设置为无效。并像中一样检查

    class Departments: NSManagedObject {
    
    // Insert code here to add functionality to your managed object subclass
        override func prepareForDeletion() {
            for teacher in self.teachers!{ 
                if let tempTeach = teacher as? Teachers{  
                    if tempTeach.departments?.count == 1{
                        self.managedObjectContext?.deleteObject(tempTeach)  
                    }else{
                        print("this teacher is assigned to another department also so dont delete it") 
                    }
                }
            }  
        }  
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-03
      • 2018-01-02
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多