如何在Azure移动应用服务客户端上处理孤立记录?

时间:2016-07-22 10:05:32

标签: c# azure azure-mobile-services

我正在使用Azure移动应用服务。我正在使用软删除和增量同步功能。

我遇到了一个有趣的边缘案例:

  1. 将新记录插入本地数据库
  2. 在后端删除记录。可以使用client.GetTable<T>().DeleteAsync(foo)而不是client.GetSyncTable<T>().DeleteAsync(foo)
  3. 直接将其删除,从而在客户端进行模拟
  4. 本地数据库现在比远程数据库还要多一个记录
  5. 再次推送
  6. 我假设最后一次推送会重新创建远程数据库上的记录,但它没有 - 这太令人惊讶了,非常非常棒,因为这是合乎逻辑的结果!

    我不明白的是,为什么?客户端如何知道不要推送那个孤立的记录?

    (是不是因为我从客户端执行了删除?所以在生产中,当我们的后端系统删除该记录时,客户端会推送它吗?)

    编辑,抱歉我没有正确解释:
    我的意思是我们有后端系统,可以直接在后端数据库上执行删除(他们不知道或不关心远程客户端)。我在上面提到了第3点,就像从客户本身那样做“hackish”的方式。无论如何,在这种情况下,客户端会有一个孤立的记录。当发生这种情况并执行推送时,客户端是否会尝试在后端重新创建该记录 - 因为它不知道后端是否删除了它?

2 个答案:

答案 0 :(得分:1)

创建同步表时,会在本地SQLite数据库中创建两个表 - 实际表和&#34;待处理操作&#34;表。当您执行SyncTable()。DeleteAsync()时,记录将从实际表中删除,并且一个条目将被放入&#34;待处理操作&#34;用于删除后端记录的表。当您执行PushAsync()时,挂起的操作表用于发送它 在网络案件中发送的请求。

还有一些比这更复杂的事情,但这是正在发生的事情的基本要点。

如果您可以访问基础SQLite数据库(例如,您在Windows上运行UWP应用程序),那么您可以检查基础SQLite数据库以查看实际发生的情况。

答案 1 :(得分:1)

软删除是客户端知道删除“孤立”记录的方式。换句话说,服务器实际上并不删除记录,而只是标记已删除的标志。正在执行脱机同步的客户端在拉取操作中获取已删除的记录,并从本地存储中删除这些记录。 (他们通过在请求中添加__includedDeleted = true标志来实现此目的。)

如果客户端更改已删除的记录并且您正在使用冲突处理(通过在客户端上安装Version字段),则将通过常规冲突处理机制拒绝更新。