创建新实体时Breeze set id:-1 state:'Added'hasTempKey:true。导出和重新导入后,Breeze没有将import -1实体与内存中的当前-1实体合并,它会添加一个新的...这可以在文档中解释...(但我们如何克服这个问题是在我的情况下的问题...)所以我试图将创建的实体设置为setUnchanged();现在导出导入周期按预期运行,但是创建的实体已经丢失了它的hasTempKey:true属性,因此新创建的实体可能与当前实体冲突...有关如何解决这些问题的一些建议将非常感谢
答案 0 :(得分:1)
我认为这个问题与您实施断开连接的应用的方法有关,如in this SO question所述。
正如我在那里所说的那样,我花了太多时间试图欺骗Breeze去做它不该做的事情。例如,您希望EntityManager.saveChanges
不实际保存到远程数据存储。但“saveChanges”的全部意义在于它永久存在。 “本地储蓄”并没有真正节省。没有人,但你知道这些保存的变化。您不知道他们是否会在您的服务器上传递业务验证规则,或者他们是否会与其他用户的更改发生冲突。如果您的笔记本电脑死亡或被盗,您当地保存的数据就会消失。
我认为微风可以帮助制作偶尔连接的应用程序。但我认为在本地正确区分存储更改以保存它们并实际远程保存它们至关重要。
您的应用可以轻松启动一系列不同的编辑会话。例如,一个会话可以是客户'A'的旅行预订,另一个会话可以是客户'B',第三个会话完全是关于其他东西......可能是客户'C'个人资料。
当您的应用无法访问服务器时,它会将每个会话保留为WIP(“正在进行中”)。每个WIP会话都有自己的序列化捆绑包,由WIP密钥标识。
除此之外:当John Papa的“Building Apps with Angular and Breeze第2部分”出现在今年晚些时候时,你会看到这种模式。
Breeze EntityManager.exportEntities(list_of_entities)
序列化有关该会话的已更改实体的所有内容,包括其更改状态,原始值和临时密钥。请记住,list_of_entities
可以是包括对象图在内的任何内容。您可以将该捆绑包保存到WIP键下的浏览器本地存储中,并在以后恢复。
我会保留一个WIP会话目录,其中包含有关整个会话状态的信息(例如,它是什么类型的编辑会话以及该会话是否已准备好远程持久化)。您的应用在离线时向用户显示WIP会话。当它获得连接时,它会经历一个“同步”阶段,在此期间它会尝试保持更改。幸运的是它成功了。如果没有,您可以在UI中重新水化会话并帮助用户协调冲突。
这些是广泛的。魔鬼在细节中。
在这种情况下,关键是你不要搞乱实体状态或临时密钥。你不关心密钥是什么或它们是否改变。序列化会话将为您保存该状态信息。序列化的捆绑包将无需投诉即可移入和移出本地存储。您正在离线或在线时按预期使用Breeze。
答案 1 :(得分:0)
目前的行为是故意的。通常我们假设临时密钥实际上不具有可比性。但是,我确实理解您的用例。因此,一种方法是:
1) import your "exported entities" into a temporary EntityManager and check for temp key collisions between this entityManager and your "destination" EntityManager.
2) Then remove any "dups" from the destination EntityManager
3) Import your original "exported entities" into your destination EntityManager
如果你知道所有的tempKeys都是重复的,你实际上可以跳过第1步。
另一种方法是使用Guid's作为你的钥匙。这完全绕过了临时密钥问题,因为Guid永远不需要是“临时的”。