更新IMobileServiceSyncTable

时间:2019-05-23 16:07:32

标签: c# xamarin.forms azure-mobile-services

我正在将Azure Easy Tables与我的Xamarin.Forms应用程序集成,到目前为止,它已经可以工作了。我可以在Azure表上执行GET和POST,而不会出现任何问题。但是,如何更新本地MobileServiceSyncTable中的现有项目并将其推送到云中?

出于测试目的,我创建了一个名为Model的简单Person,它具有一些标准属性,例如FirstName等。现在,我想做的很简单,就是更新一个人FirstName属性。到目前为止,这是我的-显然是失败的-尝试:

public async Task PatchPerson(string id)
{
    await Initialize();

    var person = personTable.Where(p => p.Id == id);

    person.Firstname = 'Something else';

    await personTable.UpdateAsync(person); // error here

    await SyncPeople();
 }

IntelliSense在尝试将此var传递给UpdateAsync()时通知我一个错误:

  

无法从“ Microsoft.WindowsAzure.MobileServices.IMobileServiceTableQuery”转换为“ Models.Person”>

好。所以我像这样投射对象,这消除了错误:

public async Task PatchPerson(string id)
{
   await Initialize();

   var person = (Person)personTable.Where(p => p.Id == id); //cast

   person.Firstname = "Something else";

   await personTable.UpdateAsync(person); // no error here

   await SyncPeople();
}

现在,当我编译并运行此代码时,程序崩溃并显示以下错误消息:

  

[0:]添加人员时出错。错误消息:指定的转换无效。

我做错了什么,我该怎么做对呢?

1 个答案:

答案 0 :(得分:0)

好的,所以我找到了解决它的方法。

我实现了一种新方法

public async Task<Person> GetPerson(string id)
{
    await Initialize();

    return await personTable.LookupAsync(id);
}

然后像这样更新我的PatchPerson()方法:

public async Task PatchPerson(string id)
{
    await Initialize();

    var person = await GetPerson(id);

    person.Age += 1;

    await personTable.UpdateAsync(person);

    await SyncPeople();
}

现在,我可以从ViewModel的Azure Easy Table中返回此Person对象:

var person = await azureMobileService.GetPerson("C3EC52BE-6FAF-490C-A78F-7AB50F796311");

然后我可以将此对象传递给新的PatchPerson()方法:

await azureMobileService.PatchPerson(person.Id);

这成功更新了Azure后端中正确的Person对象,并且更改反映在我的应用程序中。