我在将旧数据模型升级到当前模型时遇到问题。它有几层可能导致问题,我正在努力确定问题所在。
我有一个抽象的客户实体,其中包含与电话号码,电子邮件地址等的通用关系。在我的旧模型中,有一种关系,客户可以拥有1个物业(但物业可能拥有许多所有者)或客户可以在租约中是租户(但租约可以有很多租户)。我现在更新了模型,以便客户可以拥有许多属性并成为许多租约的一部分。
具体的客户实体基本上向抽象添加不同的命名信息,因此有个人,商业,政府和导入(从其他系统导入)子类。
我的期望是旧数据模型中建立的一对多关系将作为新数据模型中新的多对多关系中的第一个实例添加。遗憾的是,升级的数据存储似乎不包含属性或租约的新具体客户端中的任何关系。
旧模型:
Client{
Property<<-->Property.Owners
Tenancy<<-->Lease.Tenants
}
ImportClient:Client{
name:string
}
新模型:
Client{
Properties<<-->>Property.Owners
Tenancies<<-->>Lease.Tenants
}
ImportClient:Client{
name:string
}
所以现在我可以看到可能出现的问题。首先,客户实体中的关系名称已从属性更改为属性,从租赁更改为租约。所以我添加了一个映射模型。该模型没有自动为ClientToClient添加实体映射(仅适用于具体类),所以我尝试自己添加一个。我不确定如何设置值表达式,所以当下它是:
FUNCTION($manager,"destinationInstancesForEntityMappingName:sourceInstances:","PropertyToProperty","$source.Property")
如果我尝试将映射添加到具体类(所以ImportClientToImportClient),似乎绝对不可能正确设置关系值(基本上由编辑器拒绝)。
所以我怀疑它是否未能转移关系,因为当对客户端实体运行获取时它什么也没有返回(每当我尝试过这种情况时都是如此)或者我只是没有获得值表达式右。
帮助将不胜感激,因为目前这是阻止我主要升级到应用程序的唯一问题。
答案 0 :(得分:0)
所以解决方案正如我已经找到的那样(对于那些后来偶然发现的人......),因为我目前没有时间详细说明这里的所有代码。
步骤1:查看是否可以在没有任何迁移选项的情况下打开数据存储。如果成功继续,否则执行步骤2.
步骤2:使用[NSPersistentStoreCoordinator metadataForPersistantStore ...]检索商店元数据
步骤3:从最近到最旧的模型一次加载一个旧模型并使用[NSManagedModel isConfiguration:compatibleWithStoreMetadata:],直到找到可行的模型
步骤4:使用可行的模型创建持久性存储,然后从数据存储和持久性存储创建托管对象上下文
步骤5:在字典中缓存失败的关系(我使用UUID对来识别对象)
步骤6:使用当前的托管对象模型执行数据存储的轻量级升级
步骤7:浏览字典,获取对象并再次关联它们
是的,您将不得不使用自己的编码技巧来实现这一点(我的实例大约有250行代码),但希望这是让它运行所需的种子......