在Azure Mobile Sync中拥有自定义ID列?

时间:2017-12-14 00:07:59

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

我正在使用我的xamarin表单应用程序中的azure移动应用程序进行身份验证,一旦我检索到唯一的用户身份验证ID,我就会将其与一堆其他用户信息一起存储到名为Users的同步表中,如下所示。

所以基本上我也在我的应用程序中使用Azure Mobile Sync。下面的Id列是预定义的Azure Mobile Id。只要我拥有存储在本地同步数据库中的Id的相同用户,一切正常。

一旦,我丢失了这个本地Db信息(可能是由于重新安装应用程序或删除应用程序数据)。用户将提示重新登录,虽然我获得了相同的Azure身份验证ID,但snyc将导致Azure Users表中的新插入。因为它不知道它是现有的行。 可能的解决方案是将userAuthId设为PK(最终它是唯一的)。但如果我这样做,我将失去天蓝色的移动同步功能,不是吗?有人可以点亮我如何为自然移动同步制作自定义ID列?或者不是自动生成,我可以从客户端传递值。

enter image description here

2 个答案:

答案 0 :(得分:1)

之前我遇到过类似的问题,我只是将用户表中Id列的值设置为UserAuthId。为了添加额外的UserAuthId并将其用作其他表中的外键,我假设在用户登录后,您需要检查在线Users表并尝试检索基于该表的现有用户记录。当前UserAuthId,然后您可以插入/更新本地数据存储或直接更新您的在线Users表。此外,我建议您关注adrian hall的书籍here,了解如何使用Xamarin开发Azure移动应用程序。

答案 1 :(得分:0)

我根据Bruce Chen的建议自己找到了解决方案。基本上只删除默认值或绑定,如图像和后端Api所示,更改Post功能如下所示,您的控制器也应通过调用ClaimsPrincipal从身份验证中检索UserId,如下所示。使用此方法,您将在Api中获得经过身份验证的UserId。您可以在this github link上看到完整的实施。所以你可以把它作为表的Id传递给你。我插入之前还添加了额外的检查,如果Id已经存在或者没有,因为我没有自动生成Id。

我希望这有助于其他有同样问题的人。

    public string UserId => ((ClaimsPrincipal)User).FindFirst(ClaimTypes.NameIdentifier).Value;



public async Task<IHttpActionResult> PostUser(User item)
        {
            try
            {
                User current;
                item.Id = UserId;

                myAppsAPIContext db = new myAppsAPIContext();
                User User = db.Users.Where(u => u.Id == UserId).SingleOrDefault();
                if (User == null)
                {
                    current = await InsertAsync(item);
                }
                else
                    current = User;

                return CreatedAtRoute("Tables", new { id = current.Id }, current);
            }
            catch (Exception ex)
            {

                TelemetryClient.TrackException(ex);
                return null;
            }
        }

enter image description here