我们正在开发一个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的数据行才会发生,如果在应用程序中插入/创建记录,那么数据正在更新并且能够将这些更改也推送到服务器。
我必须使用已有数据的现有数据库和表,应用程序应该能够更新数据并将更改推送回服务器数据库。
任何人都可以帮助我失踪或做错的地方吗?
答案 0 :(得分:0)
问题在于数据库,它具有区分大小写的排序规则。我使用fiddler来跟踪移动服务在将结果推送到服务器时究竟做了什么,然后我发现在请求URL中,表列的所有表示字母都自动转换为大写字母,但在数据库中它们是小写字母。可能是由于这一点,数据在数据库中没有更新,也没有在本地数据库中滚动支持。
为了解决这个问题,我在移动服务项目的DBContext类中编写了以下代码行并进行了发布。
modelBuilder.Entity<User>().Property(p => p.Offlinepin).HasColumnName("offlinepin");
此更新工作完成后。我不知道为什么移动服务在推送失败时没有显示任何错误消息,而是回滚本地值。