我正在使用mapping model执行核心数据迁移。
新模型在名为Report
的{{1}}实体上添加了关系。
我希望强制使用此关系,而非可选。对于现有 rootReport
个实体,Report
应该是自我参考。将来添加的报告将引用其他报告作为其根,而不仅仅是他们自己。
我给出的链接很好地概述了映射模型中的表达式是如何工作的 - 它们是与NSExpression兼容的相同内容。基于此,我使用了以下针对rootReport的映射规则:
rootReport
[我格式化了 - 在文件中它被压在一行上。]
但是,我还没有设法让我的rootReport关系工作。迁移后我总是收到验证错误,并且没有为某些报告设置rootReport:
NSUnderlyingError ="错误域= NSCocoaErrorDomain代码= 134110 \"操作无法完成。 (可可错误134110。)\" UserInfo = 0x7b294630 {attribute = rootReport,entity = Report,reason =验证错误缺少强制目标关系的属性值}"
有关出错的任何线索,或有关如何调试的建议?处理全部在App Kit中,所以当异常显示时,我没有任何上下文可以进行戳和调查!
可以很好地了解映射的层次结构,从完全自动到完全手动,以及here之间的所有步骤。
如果你想了解更多关于你可以用这些映射表达式做什么( 至少适用于属性),那么有好文章here和here。
设置映射表达式以调用项目中的任意代码或数据上的现有方法很容易。它非常干净优雅。
您可以使用默认关系映射调用的FUNCTION($manager,
"destinationInstancesForEntityMappingNamed:sourceInstances:",
"ReportToReport",
$source.SELF)
表达式执行此操作。要调用类方法,请使用FUNCTION
FUNCTION(CAST("<Class-Name>", "Class"), "<class-method-name>", <any>, <arguments>, <in>, <a>, <list>)
。
答案 0 :(得分:0)
我不确定上面出了什么问题。
在我创建了映射模型之后,我可能已经对目标数据模型进行了更改,我没想到会出现问题。但是,使用文本编辑器查看映射模型时,它们包含大型二进制blob,我怀疑它们可能代表创建时的源和目标数据模型。
我删除并重新创建了映射模型,现在我对表单的自引用没有任何问题:
FUNCTION($manager,
"destinationInstancesForEntityMappingNamed:sourceInstances:",
"ReportToReport",
$source)
这几乎与问题中使用的表达相同,我发现这个表达没有用。请注意,此工作表达式仅使用$source
而不是$source.SELF
。但是,我很确定我之前会尝试过,所以我不知道这是否是我唯一错的。