为什么Azure Mobile Apps的数据模型中存在字符串ID?

DaB*_*lue 10 c# azure-mobile-services

我正在使用Azure移动应用程序中的C#来学习它们.我创建了模型以链接到我的Azure SQL DB,创建了一个像这样的DataObject:

public class Account : EntityData
{
    //public int id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }
    public string Password { get; set; }
    public DateTime dtCreated { get; set; }
    public Guid oGuid { get; set; }

}
Run Code Online (Sandbox Code Playgroud)

请注意,我注释掉了上面的public int id; 它给了我一个关于查询的重复列错误.

最后,我使用新创建的Account DataObject创建了一个控制器.

所以我运行应用程序并点击"表/帐户"功能,它返回零行(但有数据,我可以用我在天蓝色移动应用程序中使用的用户查询它).

然后我注意到模型架构如下:

[
  {
    "id": 0,
    "FirstName": "string",
    "LastName": "string",
    "PhoneNumber": "string",
    "Password": "string",
    "dtCreated": "2016-07-06T17:45:47.114Z",
    "oGuid": "string",
    "Id": "string",
    "Version": "string",
    "CreatedAt": "2016-07-06T17:45:47.114Z",
    "UpdatedAt": "2016-07-06T17:45:47.114Z",
    "Deleted": true
  }
]
Run Code Online (Sandbox Code Playgroud)

我在配置的模型中看到了几个问题(我不知道某些列来自哪里......)

首先,id列出两次,一次作为int(必须是我的),另一个id作为字符串,我不知道它来自哪里.

此外,在DB中,oGuid的类型为uniqueIdentifier; 不是字符串.这可能是也可能不是问题,因为我还无法测试.

然后还有我的数据库中不存在的其他列,包括CreatedAt(datetime),UpdatedAt(datetime),Version(字符串)和Deleted(bit).

我正在考虑我没有从该调用中获得任何数据的问题/原因是数据不匹配.

我是否需要在api测试中添加模型中列出的其他列?

我也测试过试图调用/ table/Account/3加载一个特定的帐户并且它没有返回任何行...我猜它是模型不匹配但是我不确定这是问题还是其他原因造成的它?我没有看到任何错误或警告.


更新

我弄清楚模型首先和Azure发生了什么,以及如何将Azure中的现有数据库附加到新代码中.我打算在这里发布,希望能节省其他时间.这真的应该更容易做到.我不喜欢codefirst(还),因为我喜欢手动控制数据库......所以这使我更容易使用db后端.

首先我创建了一个新项目(Azure移动应用程序)然后在模型下我右键单击模型并添加 - >新实体数据模型然后添加到azure db名称,密码并给它我的"用户创建的配置文件名称",如下所示.必须在web.config中编辑此连接,如下所示.

然后,我必须在DataObjects中创建表的模型(没有MS必需的列)并从数据对象创建一个控制器.然后我必须编辑web.config并设置一个非实体数据库连接字符串:例如:

<add name="[user created preset name]" providerName="System.Data.SqlClient" connectionString="Server=[Azuredb server connection];initial catalog=[DBName];persist security info=True;user id=[user];password=[pass];MultipleActiveResultSets=True"/>
Run Code Online (Sandbox Code Playgroud)

最后,在MobileServiceContext中,我必须将DataObject模型映射到Azure sql中的表,并将要使用的连接字符串从默认的MS_TableConnectionString设置为web.config中的connectionstring.

    private const string connectionStringName = "Name=[user created preset name]";
Run Code Online (Sandbox Code Playgroud)

在OnModelCreating()下我添加了:

    modelBuilder.Entity<Account>().ToTable("tblAccount");
Run Code Online (Sandbox Code Playgroud)

Account是我在DataObjects中创建的模型(类),tblAccount是AzureDB中的表名.

Adr*_*all 6

EntityData抽象类包含其他字段 - 移动脱机同步有五个字段

  • Id(字符串 - 通常是GUID - 必须全局唯一)
  • UpdatedAt(DateTimeOffset - 通过数据库触发器自动维护 - 用于增量同步)
  • CreateAt(DateTimeOffset - 用作数据库分区的键以优化读取,但未使用)
  • 版本(byte [] - 时间戳 - 用于乐观并发/冲突解决)
  • 已删除(布尔值 - 用于在删除记录时更新其他客户端 - 称为软删除).

您的客户端需要其客户端模型中的所有这些字段,但Deleted除外(除非已请求,否则不会进行传输,并通过Mobile Apps SDK自动处理以清除已删除记录的脱机同步).

您还没有说过后端或前端使用的语言.但是,在两种情况下都可以使用日志记录 - 您只需将其打开,捕获异常等.一些参考资料: