在对表执行PullAsync()之后,我无法更新表数据 - .Net Mobile服务中的脱机数据同步

时间:2015-08-07 13:31:26

标签: azure windows-store-apps azure-sql-database azure-mobile-services

我们正在开发一个Windows应用商店8.1应用,我们使用Azure移动服务(.net后端)实现了离线数据同步。

我们正在使用带有内部部署SQL Server的移动服务和使用代码优先迁移的现有数据库。

我们有一个USER表,用于在数据库中存储用户emailId和offlinePin。

我们还在应用中实施了AAD单点登录。对于将要使用该应用程序的所有活动目录用户,我们将他们的电子邮件ID添加到User表中,但不包含offlinePin值。

在客户端应用中,我们根据使用AAD单点登录登录应用的用户调用以下行。

声明:

private IMobileServiceSyncTable<Users> usertable=  App.MobileService.GetSyncTable<Users>();

await usertable.PullAsync("SyncLoggedInUserInfo", usertable.Where(user => user.Email == App.UserEmail));

现在,对于根据他/她的邮件ID登录的用户,我们使用上面的行从USER表中提取他们的信息。

如果登录用户没有离线销,那么应用程序将提示用户创建一个并将其保存到本地SQLite USER表中。

为了更新用户offlinePin,我们将调用以下行

var userInfo = await usertable.Where(x => x.Email == App.UserEmail).ToListAsync();
                if (userInfo .FirstOrDefault()!=null)
                {
                    var emp = userInfo .FirstOrDefault();
                    emp.OfflinePin = pinpswrdbx.Password;
                   await usertable.UpdateAsync(emp);
                }

更新完成后,我们将这些更改推送到服务器。

await App.MobileService.SyncContext.PushAsync();

问题在于,调用更新脱机引脚的行无效,意味着

await usertable.UpdateAsync(emp);没有更新本地表中的相应员工信息。我们在这里没有任何异常,它已成功执行,但离线引脚列值未使用用户输入的引脚值进行更新。

只有在数据库中直接添加并同步到本地SQLite DB的数据行才会发生,如果在应用程序中插入/创建记录,那么数据正在更新并且能够将这些更改也推送到服务器。

我必须使用已有数据的现有数据库和表,应用程序应该能够更新数据并将更改推送回服务器数据库。

任何人都可以帮助我失踪或做错的地方吗?

1 个答案:

答案 0 :(得分:0)

问题在于数据库,它具有区分大小写的排序规则。我使用fiddler来跟踪移动服务在将结果推送到服务器时究竟做了什么,然后我发现在请求URL中,表列的所有表示字母都自动转换为大写字母,但在数据库中它们是小写字母。可能是由于这一点,数据在数据库中没有更新,也没有在本地数据库中滚动支持。

为了解决这个问题,我在移动服务项目的DBContext类中编写了以下代码行并进行了发布。

modelBuilder.Entity<User>().Property(p => p.Offlinepin).HasColumnName("offlinepin");

此更新工作完成后。我不知道为什么移动服务在推送失败时没有显示任何错误消息,而是回滚本地值。