我有一个运行表控制器的Azure移动应用程序服务,并使用Microsoft.Azure.Mobile.Client
和Microsoft.Azure.Mobile.Client.SQLiteStore
Nuget程序包运行了一个本地SQLite存储,如Microsoft文档所示。
从Xamarin.Forms应用程序中,我已经使用实时服务器数据通过直接调用Azure服务来实现实体,而没有任何问题。
尝试使用Azure SDK提供的脱机同步功能执行相同操作,我可以毫无问题地将更改从服务器下拉到客户端,但是尝试在客户端上更改或插入记录然后推送更改失败。
客户端基础实体类:
using System;
using Microsoft.WindowsAzure.MobileServices;
public class TableObject
{
public string Id { get; set; }
[UpdatedAt]
public DateTimeOffset? UpdatedAt { get; set; }
[CreatedAt]
public DateTimeOffset? CreatedAt { get; set; }
[Version]
public string Version { get; set; }
[Deleted]
public bool Deleted { get; set; }
}
客户端模型:
public class UserData : TableObject
{
public string UserId { get; set; }
// Other properties
public UserData () { }
public UserData (UserData userData) : base(userData)
{
UserId = userData.UserId;
}
public async Task<User> User()
{
return await Database.Instance.GetItemAsync<User>(x => x.Id == UserId);
}
}
服务器型号:
public class UserData : EntityData
{
[ForeignKey("User")]
public string UserId { get; set; }
public User User { get; set; }
// Other properties
}
我的繁殖步骤:
使用同步服务将新记录从本地存储推送到服务器。 失败
捕获(MobileServicePushFailedException排除) { 如果(exc.PushResult!= null) { syncErrors = exc.PushResult.Errors; } }
exc堆栈跟踪:
at Microsoft.WindowsAzure.MobileServices.Sync.MobileServiceSyncContext+<ExecuteSyncAction>d__34.MoveNext () [0x00090] in <24dbefba60fd49f4b193cdf58abf3290>:0
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.WindowsAzure.MobileServices.Sync.MobileServiceSyncContext+<PushAsync>d__33.MoveNext () [0x00143] in <24dbefba60fd49f4b193cdf58abf3290>:0
PushResult具有单个插入失败,并且该项目包含2个属性(Id,UserId)。结果和状态为null,处理的为false,并且永远不会调用表控制器中的post方法。请记住,在拉取过程中会调用表控制器上的Get方法。
如果我们拉用户记录,在本地更新它,然后尝试将其向上推,也会发生这种情况。