在 Core Data 迁移过程中添加关系——自引用

Adding relations during a Core Data migration – self reference

我正在使用 mapping model 执行核心数据迁移。

新模型在名为 rootReportReport 实体上添加了一个关系。

我想让这个关系成为强制性的,而不是可选的。对于 existing Report 个实体,rootReport 应该是一个自我引用。将来添加的报表将引用其他报表作为它们的根,而不仅仅是它们自己。

我给出的 link 很好地概述了映射模型中的表达式是如何工作的——它们与 NSExpression 兼容。基于此,我对 rootReport 使用以下映射规则:

FUNCTION($manager,
         "destinationInstancesForEntityMappingNamed:sourceInstances:",
         "ReportToReport", 
         $source.SELF)

[我格式化了——在文件中它全部被压在一行上。]

但是,我还没有设法让它为我的 rootReport 关系工作。迁移后我总是收到验证错误,抱怨没有为某些报告设置 rootReport:

NSUnderlyingError = "Error Domain=NSCocoaErrorDomain Code=134110 \"The operation couldn\U2019t be completed. (Cocoa error 134110.)\" UserInfo=0x7b294630 {attribute=rootReport, entity=Report, reason=Validation error missing attribute values on mandatory destination relationship}"

关于问题的任何线索,或关于如何调试的建议?处理全部在 App Kit 中,所以当异常出现时我没有任何上下文可以戳和调查!


映射层次结构很好,从完全自动到完全手动,以及 here 之间的所有步骤。

如果您想更多地了解可以使用这些映射表达式做什么(确实 至少对属性很有效),这里有很好的文章here and here.

设置映射表达式以调用项目中的任意代码或数据上的现有方法很容易。这一切都非常干净和优雅。

您可以使用默认关系映射调用的 FUNCTION 表达式来执行此操作。要调用 class 方法,您可以使用 FUNCTION(CAST("<Class-Name>", "Class"), "<class-method-name>", <any>, <arguments>, <in>, <a>, <list>),如图 here.

我不确定上面出了什么问题。

我可能在创建映射模型后更改了目标数据模型,我认为这不会成为问题。但是,使用文本编辑器查看映射模型时,它们包含大型二进制 blob,我怀疑这可能代表创建时的源数据模型和目标数据模型。

我删除并重新创建了映射模型,现在我对以下形式的自引用没问题了:

FUNCTION($manager,
        "destinationInstancesForEntityMappingNamed:sourceInstances:",
        "ReportToReport", 
        $source)

这与问题中使用的表达式几乎相同,但我发现它不起作用。请注意,此工作表达式仅使用 $source 而不是 $source.SELF。但是,我很确定我以前会尝试过,所以我不知道这是否是我唯一出错的地方。