我正在使用Azure移动应用服务。我正在使用软删除和增量同步功能。
我遇到了一个有趣的边缘案例:
client.GetTable<T>().DeleteAsync(foo)
而不是client.GetSyncTable<T>().DeleteAsync(foo)
我假设最后一次推送会重新创建远程数据库上的记录,但它没有 - 这太令人惊讶了,非常非常棒,因为这是合乎逻辑的结果!
我不明白的是,为什么?客户端如何知道不要推送那个孤立的记录?
(是不是因为我从客户端执行了删除?所以在生产中,当我们的后端系统删除该记录时,客户端会推送它吗?)
编辑,抱歉我没有正确解释:
我的意思是我们有后端系统,可以直接在后端数据库上执行删除(他们不知道或不关心远程客户端)。我在上面提到了第3点,就像从客户本身那样做“hackish”的方式。无论如何,在这种情况下,客户端会有一个孤立的记录。当发生这种情况并执行推送时,客户端是否会尝试在后端重新创建该记录 - 因为它不知道后端是否删除了它?
答案 0 :(得分:1)
创建同步表时,会在本地SQLite数据库中创建两个表 - 实际表和&#34;待处理操作&#34;表。当您执行SyncTable()。DeleteAsync()时,记录将从实际表中删除,并且一个条目将被放入&#34;待处理操作&#34;用于删除后端记录的表。当您执行PushAsync()时,挂起的操作表用于发送它 在网络案件中发送的请求。
还有一些比这更复杂的事情,但这是正在发生的事情的基本要点。
如果您可以访问基础SQLite数据库(例如,您在Windows上运行UWP应用程序),那么您可以检查基础SQLite数据库以查看实际发生的情况。
答案 1 :(得分:1)
软删除是客户端知道删除“孤立”记录的方式。换句话说,服务器实际上并不删除记录,而只是标记已删除的标志。正在执行脱机同步的客户端在拉取操作中获取已删除的记录,并从本地存储中删除这些记录。 (他们通过在请求中添加__includedDeleted = true标志来实现此目的。)
如果客户端更改已删除的记录并且您正在使用冲突处理(通过在客户端上安装Version字段),则将通过常规冲突处理机制拒绝更新。