我正在尝试在我的Xamarin应用程序中使用Azures Easy Tables。
我在azure的2个表中有数据,我通过csv添加。这些表仅包括字符串,日期和数字等标准类型,并且正确同步到设备。
此外,我还有其他几个表存在于本地同步存储中。这些表/类也使用我自己定义的非标准类型。例如,我有一个类Contact,它有一个属性Company,它又是另一个有几个标准属性的类。这些表目前仅保存在同步存储中的本地,并且按预期工作。我现在正尝试将这些表同步到Azure Easy Tables。
所以我所做的是将表创建为Azure中名为Contact的Azure Easy Table,并激活动态模式。当我尝试Client.SyncContext.PushAsync()时,我得到以下异常:
MobileServiceLocalStoreException:
"Push operation has failed. See the PushResult for details."
Inner Exception / JsonReaderException:
"Failed to read errors from the local store."
Inner Exception / JsonException
"Unexpected character encountered while parsing value: C. Path '', line 0, position 0."
推送结果似乎没有提供任何信息(错误计数0)
我不知道这个Exception告诉我的是什么。也许问题与非标准属性有关?这些属性如何映射到一个简单的表。像公司这样的非标准财产只是分为几个列,如姓名,街道,城市?
或者Exception是否指向本地同步存储的其他问题?正如我所说,本地同步存储目前工作正常,一些表的azure easy table的拉动也正常。
我很感激每一个可能指向正确方向的答案。
答案 0 :(得分:1)
根据我的理解,您正在处理联系和公司表之间的1:1关系。对于离线同步,您需要在移动客户端中定义Contact和Company类,如下所示:
适用于移动客户端型号
public class Contact : TableData
{
public string ContactName {get;set;}
public string Phone {get;set;}
public string Address {get;set;}
public string CompanyId {get;set;}
}
public class Company : TableData
{
public string CompanyName {get;set;}
public string Address {get;set;}
}
注意:正如adrian hall的书Chapter3 :Relationships所述,关于移动客户端的关系如下:
您必须在客户端代码中遵循一些规则:
- 在将该公司与
Company
相关联之前,您需要确保创建Contact
。- 您需要将
CompanyId
与Contact
一起存储,而不是Company
对象(正如您在“实体框架”中通常所做的那样)。如果您在离线模式下
InsertAsync
Company
,则会在使用它之前将其置于操作队列中。由于操作队列按顺序处理,因此Company
将在任何将使用它的记录更新之前发送到后端。
对于Azure Easy Tables,您需要同时创建Contact和Company表,它会自动为您创建的表创建Node.js后端。
我更希望单独处理表并手动处理移动客户端上的关系管理,这可以通过避免大多数关系的复杂性使服务器更简单。此外,您可以参考Chapter 3 - Data Access and Offline Sync。