0

当您创建新实体时,Breeze 设置 id:-1 state:'Added' hasTempKey:true。导出和重新导入后,Breeze 不会将导入 -1 实体与内存中的当前 -1 实体合并,它会添加一个新实体......这是在文档中解释......(但我们如何克服这个问题是在我的情况下的问题......)所以我尝试将创建的实体设置为 setUnchanged(); 现在导出导入周期按预期运行,但创建的实体失去了它的 hasTempKey:true 属性,因此新创建的实体可能与当前的实体发生冲突......关于如何解决这些问题的一些建议将不胜感激,谢谢

4

2 回答 2

1

我假设这个问题与您在此 SO question中描述的实现断开连接的应用程序的方法有关。

正如我在那里所说的,我你花了太多时间试图欺骗 Breeze 做它不应该做的事情。例如,您不想EntityManager.saveChanges实际保存到远程数据存储。但“saveChanges”的全部意义在于它永久存在。“本地保存”并不是真正的保存。除了您之外,没有人知道这些已保存的更改。您不知道他们是否会通过您服务器上的业务验证规则,或者他们是否会与其他用户的更改发生冲突。如果您的笔记本电脑死机或被盗,您本地保存的数据就会消失。

我认为微风可以为制作偶尔连接的应用程序提供巨大帮助。但我认为正确区分本地存储更改以保存它们和实际远程保存它们是至关重要的。

断开连接的应用程序概述

我敦促你采取不同的策略。

您的应用程序可以轻松启动一系列不同的编辑会话。例如,一个会话可能是客户“A”的旅行预订,另一个会话可能是客户“B”的,第三个会话完全是关于其他事情的……可能是客户“C”的个人资料。

当您的应用无法访问服务器时,它会将每个会话保留为 WIP(“正在进行的工作”)。每个 WIP 会话都有自己的序列化包,由 WIP 密钥标识。

另外:你会在今年晚些时候出版的 John Papa 的“使用 Angular 和 Breeze 构建应用程序第 2 部分”中看到这种模式。

BreezeEntityManager.exportEntities(list_of_entities)序列化有关该会话的更改实体的所有内容,包括它们的更改状态、原始值和临时键。请记住,list_of_entities可以是任何东西,包括对象图。您可以将该捆绑包保存到 WIP 密钥下的浏览器本地存储中,并在以后恢复它。

我会保留一个 WIP 会话目录,其中包含有关整个会话状态的信息(例如,它是哪种编辑会话以及该会话是否已准备好远程持久化)。您的应用在离线时向用户呈现 WIP 会话。当它获得连接时,它会经历一个“同步”阶段,在此阶段它会尝试保持更改。幸运的是它成功了。如果没有,您可以在 UI 中重新处理会话并帮助用户协调冲突。

这些是广泛的笔触。细节决定成败。

在这种情况下,关键是不要弄乱实体状态或临时键。您不在乎键是什么或它们是否更改。序列化会话将为您保存该状态信息。序列化的捆绑包将毫无怨言地进出本地存储。您在离线或在线时按预期使用 Breeze。

于 2013-10-25T00:51:23.893 回答
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

如果您知道所有 tempKey 都是重复的,则实际上可以跳过第 1 步。

另一种方法是使用 Guid 作为您的密钥。这完全绕过了临时密钥问题,因为 Guid 永远不需要是“临时的”。

于 2013-10-24T21:24:05.980 回答