为EntityFramework表创建自动增量ID字段(天蓝色移动服务)

时间:2015-09-29 09:10:08

标签: c# entity-framework azure-mobile-services

我有几个使用EntityFramework映射到数据库表的数据类。所有这些类都派生自Microsoft.WindowsAzure.Mobile.Service.Entity.EntityData类,以自动填充CreatedAt,UpdatedAt和Version,Deleted字段。问题是客户端应用程序POST数据后端后置参数所需的Id字段。因此客户端应该生成他身份的ID。因此没有机会使其自动增量,因为客户端不知道生成下一个id的记录数量。因此,客户端的一个解决方案是生成GUID和POST到后端。这对我不利,因为我需要知道记录号码。而且如果我有数十亿的记录,我也不确定是否会有重复。

目前的解决方法就是这样。在Post方法中的TableController类中,我正在检查Id字段是否存在,如果没有,则将其设置为记录计数+ 1.这是代码:

    public IHttpActionResult PostUser(User user)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

       if (string.IsNullOrWhiteSpace(user.Id))
            user.Id = (_db.Users.Count() + 1).ToString();

        _db.Users.Add(user);

        try
        {
            _db.SaveChanges();
        }
        catch (DbUpdateException)
        {
            if (UserExists(user.Id))
            {
                return Conflict();
            }
            else
            {
                throw;
            }
        }

        return CreatedAtRoute("api_v1", new { id = user.Id }, user);
    }

我困扰的是如果2个用户将执行POST请求并且.Count()方法在那时返回相同的数字,那么Id将是相同的并且出现冲突。有可能吗? 第二件事是我有12个表控制器,需要在任何地方进行此ID检查。对此有更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:1)

简短的回答是你不应该。

一般来说,这对移动服务来说是不好的做法,因为它会像您描述的那样产生问题。

如果您需要某种自动递增的字段,请在服务器上生成并删除对客户端的依赖。