为什么 Azure 移动应用的数据模型中有一个字符串 ID



我正在Azure Mobile Apps中使用C#,试图学习它们。 我创建了模型以链接到我的Azure SQL DB,创建了一个数据对象,如下所示:

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; }
}

请注意,我注释掉了上面的公共 int id;它在查询上给了我一个重复的列错误。

最后,我使用新创建的帐户数据对象创建了一个控制器。

所以我运行了应用程序并点击了"表/帐户"函数,它返回了零行(但有数据,我可以与我在 azure 移动应用程序中使用的用户一起查询它)。

然后我注意到模型模式如下:

[
  {
    "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
  }
]

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

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

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

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

我认为我没有从该调用中获取任何数据的问题/原因是数据不匹配。

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

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


更新

我弄清楚了模型优先和 Azure 是怎么回事,以及如何将 Azure 中的现有数据库附加到新代码。 我将在这里发布这个,希望它能节省其他人的时间。 这真的应该更容易做到。 我还不喜欢代码优先,因为我喜欢手动控制数据库......因此,这使我更容易使用数据库后端。

首先,我创建了一个新项目(Azure 移动应用程序),然后在模型下右键单击模型并添加新>实体数据模型,然后添加 azure 数据库名称、密码并为其提供我的"用户创建的配置文件名称",如下所示。 必须在 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"/>

最后,在 MobileServiceContext 中,我必须将数据对象模型映射到 Azure sql 中的表,并将连接字符串设置为从默认MS_TableConnectionString到 web.config 中的连接字符串。

    private const string connectionStringName = "Name=[user created preset name]";

在OnModelCreateating()下,我添加了:

    modelBuilder.Entity<Account>().ToTable("tblAccount");

其中帐户是我在DataObjects中创建的模型(类),tblAccount是AzureDB中的表名。

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

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

在其客户端模型中需要所有这些字段,但"已删除"除外(除非请求,否则不会传输该字段,并通过移动应用 SDK 自动处理,以清除已删除记录的脱机同步)。

你还没有说后端或前端使用什么语言。 但是,日志记录在这两种情况下都可用 - 您只需打开它,捕获异常等。 为您提供的一些参考资料:

  • 节点(后端):https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-node-backend-how-to-use-server-sdk/
  • .NET(后端):https://shellmonger.com/2016/05/11/30-days-of-zumo-v2-azure-mobile-apps-day-19-asp-net-table-controllers/

最新更新