C# Azure移动应用程序服务客户端上的孤立记录如何处理?

C# Azure移动应用程序服务客户端上的孤立记录如何处理?,c#,azure,azure-mobile-services,C#,Azure,Azure Mobile Services,我正在使用Azure移动应用程序服务。我正在使用软删除和增量同步功能 我遇到了一个有趣的边缘案例: 将新记录插入本地数据库 推 记录在后端被删除。通过直接使用client.GetTable().deleteAncy(foo)notclient.GetSyncTable().deleteAncy(foo) 本地数据库现在比远程数据库多了一条记录 再次推压 我假设最后一次推送会在远程数据库上重新创建记录,但事实并非如此——这是令人惊讶的,非常令人敬畏,因为这是合乎逻辑的结果 我不明白的是,为什么?客

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

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

  • 将新记录插入本地数据库
  • 记录在后端被删除。通过直接使用
    client.GetTable().deleteAncy(foo)
    not
    client.GetSyncTable().deleteAncy(foo)
  • 本地数据库现在比远程数据库多了一条记录
  • 再次推压
  • 我假设最后一次推送会在远程数据库上重新创建记录,但事实并非如此——这是令人惊讶的,非常令人敬畏,因为这是合乎逻辑的结果

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

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

    编辑,抱歉我没有正确解释:

    我的意思是我们有后端系统,可以直接在后端数据库上执行删除操作(他们不知道或不关心远程客户端)。我在上面提到了第3点,这是从客户机本身开始的一种“黑客”方式。无论如何,在这种情况下,客户端上会有一个孤立的记录。发生这种情况并执行推送时,客户端是否会尝试在后端重新创建该记录?因为它不知道后端是否删除了该记录?

    创建同步表时,会在本地SQLite数据库中创建两个表-实际表和“挂起的操作”表。执行SyncTable().DeleteAsync()时,将从实际表中删除记录,并在“挂起的操作”表中放置一个条目以删除后端的记录。执行PushAsync()时,将使用挂起的操作表发送相同的操作 本应在在线案例中发送的请求

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


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

    软删除是客户端知道如何删除“孤立”记录的方式。换句话说,服务器实际上并没有删除记录,只是标记删除标志。作为拉取操作的一部分,正在进行脱机同步的客户端将获取已删除的记录,并从本地存储中删除这些记录。(他们通过在请求中添加uu includedeleted=true标志来实现这一点。)


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

    对不起,可能是我误解了您,或者我没有正确解释自己-我想您描述的是“传统”离线删除案例?在上面添加了一个编辑…啊-我明白了。如果知道会发生这种情况,可以在客户端上使用PurgeAsync()清除特定记录或所有记录,然后重新同步。你如何告诉你的客户进行清理取决于你。在同一个客户端上,您可以PurgeAsync()删除要删除的单个记录。好的,我想我明白了。如果我们的服务器端系统直接删除记录(
    从[Customer]WHERE…
    )中删除,那么我将遇到上述问题。所以你的意思是,服务器端系统永远不能删除记录,而是要设置它的软删除属性?没错。否则,您需要使用purgesync清除客户机数据库以清除这些孤立记录。