У меня есть служба мобильных приложений Azure, работающая с контроллерами таблиц, и локальное хранилище SQLite, использующее пакеты Nuget Microsoft.Azure.Mobile.Client
и Microsoft.Azure.Mobile.Client.SQLiteStore
, как продемонстрировано в документации 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
}
Мои шаги воспроизведения:
- На клиенте выполните публикацию на контроллере API, вставив новую запись пользователя в базу данных сервера. Успех
- Выполнение Push от клиента с помощью службы синхронизации (не отправляет записи). Успех
- Извлечение новой пользовательской записи с сервера на клиент с использованием службы синхронизации. Успех
- Создание записей UserData с настройкой UserId и сохранение их в локальном хранилище клиента с помощью службы синхронизации. Успех
Передача новой записи из локального хранилища на сервер с помощью службы синхронизации. Сбой
catch (MobileServicePushFailedException exc) {if (exc.PushResult! = Null) {syncErrors = exc.PushResult.Errors;}}
без трассировки стека:
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),Result и Status имеют значение null, Handled - false, а метод post в контроллере таблицы никогда не вызывается.Имейте в виду, что при вытягивании вызывается метод Get на контроллере таблицы.
Это также происходит, если мы извлекаем запись пользователя, обновляем ее локально, а затем пытаемся подтолкнуть ее вверх.