Служба синхронизации мобильного приложения Azure. Ошибка вставки или обновления - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть служба мобильных приложений 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
}

Мои шаги воспроизведения:

  1. На клиенте выполните публикацию на контроллере API, вставив новую запись пользователя в базу данных сервера. Успех
  2. Выполнение Push от клиента с помощью службы синхронизации (не отправляет записи). Успех
  3. Извлечение новой пользовательской записи с сервера на клиент с использованием службы синхронизации. Успех
  4. Создание записей UserData с настройкой UserId и сохранение их в локальном хранилище клиента с помощью службы синхронизации. Успех
  5. Передача новой записи из локального хранилища на сервер с помощью службы синхронизации. Сбой

    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 на контроллере таблицы.

Это также происходит, если мы извлекаем запись пользователя, обновляем ее локально, а затем пытаемся подтолкнуть ее вверх.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...