在 table 上执行 PullAsync() 后,我无法更新 table 数据 - .Net 移动服务中的离线数据同步
After doing PullAsync() on a table, I am unable to update the table data - Offline data sync in .Net Mobile service
我们正在开发一个 windows 商店 8.1 应用程序,因为我们使用 Azure 移动服务(.net 后端)实现了离线数据同步。
我们使用带有内部部署的移动服务 SQL 服务器和使用代码优先迁移的现有数据库。
我们有一个 USER table,它在数据库中存储用户 emailId 和 offlinePin。
我们还在应用程序中实现了 AAD 单点登录。对于将要使用该应用程序的所有 Active Directory 用户,我们将他们的电子邮件 ID 添加到用户 table 而没有 offlinePin 值。
在客户端应用程序中,我们根据使用 AAD 单点登录登录应用程序的用户调用以下行。
声明:
private IMobileServiceSyncTable<Users> usertable= App.MobileService.GetSyncTable<Users>();
await usertable.PullAsync("SyncLoggedInUserInfo", usertable.Where(user => user.Email == App.UserEmail));
现在,对于基于 his/her 邮件 ID 登录的用户,我们使用上面的行从用户 table 中提取他们的信息。
如果登录用户没有离线 PIN,则应用程序将提示用户创建一个并将其保存到本地 SQLite USER table.
为了更新用户 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();
这里的问题是,要求更新离线 pin 的线路不工作,意味着
等待usertable.UpdateAsync(emp);未更新本地 table 中的相应员工信息。我们在这里没有遇到任何异常,它执行成功但离线 pin 列值未随用户输入的 pin 值更新。
它只发生在直接添加到数据库并同步到本地 SQLite DB 的数据行中,如果记录在应用程序中 inserted/created 而不是在应用程序中创建的然后该数据正在更新并且我也能够将这些更改推送到服务器。
我必须使用现有的数据库和 table 中已经有数据的应用程序应该能够更新数据并将更改推送回服务器数据库。
任何人都可以帮我解决我遗漏或做错的地方吗?
问题出在数据库上,它具有区分大小写的排序规则。我使用 fiddler 来跟踪移动服务在将结果推送到服务器时究竟做了什么,然后我发现在请求 URL 中 table 列的所有说明字母都自动转换为大写字母,但是在数据库中,它们是小写字母。可能是由于这个原因,数据没有在数据库中更新,也没有在本地数据库中回滚。
为了克服这个问题,我在移动服务项目的 DBContext class 中编写了以下代码行并发布了。
modelBuilder.Entity<User>().Property(p => p.Offlinepin).HasColumnName("offlinepin");
此更新后有效。我不知道为什么移动服务在推送失败时没有显示任何错误消息而是回滚本地值。
我们正在开发一个 windows 商店 8.1 应用程序,因为我们使用 Azure 移动服务(.net 后端)实现了离线数据同步。
我们使用带有内部部署的移动服务 SQL 服务器和使用代码优先迁移的现有数据库。
我们有一个 USER table,它在数据库中存储用户 emailId 和 offlinePin。
我们还在应用程序中实现了 AAD 单点登录。对于将要使用该应用程序的所有 Active Directory 用户,我们将他们的电子邮件 ID 添加到用户 table 而没有 offlinePin 值。
在客户端应用程序中,我们根据使用 AAD 单点登录登录应用程序的用户调用以下行。
声明:
private IMobileServiceSyncTable<Users> usertable= App.MobileService.GetSyncTable<Users>();
await usertable.PullAsync("SyncLoggedInUserInfo", usertable.Where(user => user.Email == App.UserEmail));
现在,对于基于 his/her 邮件 ID 登录的用户,我们使用上面的行从用户 table 中提取他们的信息。
如果登录用户没有离线 PIN,则应用程序将提示用户创建一个并将其保存到本地 SQLite USER table.
为了更新用户 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();
这里的问题是,要求更新离线 pin 的线路不工作,意味着
等待usertable.UpdateAsync(emp);未更新本地 table 中的相应员工信息。我们在这里没有遇到任何异常,它执行成功但离线 pin 列值未随用户输入的 pin 值更新。
它只发生在直接添加到数据库并同步到本地 SQLite DB 的数据行中,如果记录在应用程序中 inserted/created 而不是在应用程序中创建的然后该数据正在更新并且我也能够将这些更改推送到服务器。
我必须使用现有的数据库和 table 中已经有数据的应用程序应该能够更新数据并将更改推送回服务器数据库。
任何人都可以帮我解决我遗漏或做错的地方吗?
问题出在数据库上,它具有区分大小写的排序规则。我使用 fiddler 来跟踪移动服务在将结果推送到服务器时究竟做了什么,然后我发现在请求 URL 中 table 列的所有说明字母都自动转换为大写字母,但是在数据库中,它们是小写字母。可能是由于这个原因,数据没有在数据库中更新,也没有在本地数据库中回滚。
为了克服这个问题,我在移动服务项目的 DBContext class 中编写了以下代码行并发布了。
modelBuilder.Entity<User>().Property(p => p.Offlinepin).HasColumnName("offlinepin");
此更新后有效。我不知道为什么移动服务在推送失败时没有显示任何错误消息而是回滚本地值。