从单个实体迁移到具有子实体的抽象父实体,未调用 NSEntityMigrationPolicy

Posted

技术标签:

【中文标题】从单个实体迁移到具有子实体的抽象父实体,未调用 NSEntityMigrationPolicy【英文标题】:Migrating from a single entity to an abstract parent entity with child entities, NSEntityMigrationPolicy not called 【发布时间】:2011-03-03 23:00:49 【问题描述】:

我正在尝试升级我当前的应用程序以使用抽象父实体和专门的子实体。 我创建了一个自定义 NSEntityMigrationPolicy,并在映射模型中将自定义策略设置为我的类的名称。

我正在像这样初始化我的持久存储,这应该是相当标准的:

NSError *error=nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                     nil];

if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) 
    NSLog(@"Error adding persistent store : %@",[error description]);
    NSAssert(error==nil,[error localizedDescription]);
    

当我运行应用程序时,我收到以下错误:

由于未捕获而终止应用 例外 'NSInternalInconsistencyException', 原因:'操作不能 完全的。 (可可错误 134140。)'

[error userInfo] 包含“reason=Can't find mapping model for migration

我已验证数据模型的版本 1 将打开,如果我设置 NSInferMappingModelAutomaticallyOption 我会得到迁移,尽管我的实体没有正确迁移(如预期的那样)。

我已验证映射模型 (cdm) 在应用程序包中,但不知何故它拒绝找到它。 我还在自定义迁移策略中设置了断点和 NSLog() 语句,无论有没有 NSInferMappingModelAutomaticallyOption

,它都不会运行

关于为什么它似乎无法找到映射模型的任何提示?

【问题讨论】:

【参考方案1】:

首先,抽象实体附加了相当大的惩罚。摘要的所有子项都将存储在同一个表中。这将创建一个非常宽的桌子,里面有很多空隙。我建议检查您的数据模型并确保这是您真正想要的。

其次,如果您找不到映射模型,这意味着它没有与源或目标对齐。如果您在创建映射模型后更改了目的地,它将找不到地图。创建映射模型需要是新模型完成后的最后一步。我什至建议锁定模型。

【讨论】:

在模拟器上检查了我的应用程序生成的数据库后,我得出了同样的结论。如果所有实体最终都在同一个表中,我当然可以以更优化的方式设计我的架构,这种方式甚至可以允许简单的迁移。 虽然我的问题仍未得到解答(我已经在我的架构之后多次创建了迁移),但我将其标记为已解决。也许抽象的父实体对于 ios 应用程序来说有点矫枉过正。 在拔掉头发几天后,这对我有帮助。我删除了我的映射策略和映射模型并重新开始。 Marcus 是对的,创建映射模型和自定义策略应该是您做的最后一件事。非常感谢。【参考方案2】:

我似乎已经解决了上述问题,虽然我不知道我做了什么。

尝试了 4 天的迁移工作,我终于放弃了,抓紧设计,重新开始。 在这个过程中的某个地方,我将 git 的主分支重置为更早的分支以检查一些细节,我不小心启动了调试器。 令我惊讶的是,它现在可以正常运行迁移,并且一切正常。

我最好的猜测是 XCode 有一些旧的迁移在清理构建时未能删除(即使我已经手动删除了构建目录)

【讨论】:

以上是关于从单个实体迁移到具有子实体的抽象父实体,未调用 NSEntityMigrationPolicy的主要内容,如果未能解决你的问题,请参考以下文章

使用 JPA 连接从父实体返回子实体

如何将项目添加到具有Android Room中父实体的外键引用的子实体?

使用 NSFetchedResultsController 的子实体到父实体的谓词

最有效的实体框架代码第一方法展平/投影具有特定子实体的父实体

实体框架代码优先 - 通过主键将子实体添加到父实体

如何在不更新具有多对多关系的子实体的情况下保留父实体?