在 Azure Mobile Sync 中有自定义 ID 列?
Having Custom Id column in Azure Mobile Sync?
我在我的 xamarin 表单应用程序中使用 azure 移动应用程序进行身份验证,一旦我检索到唯一的用户身份验证 ID,我就会将其与其他用户信息一起存储到名为用户的同步 table 中,如下所示.
所以基本上我也在我的应用程序中使用 Azure Mobile Sync。下面的 Id 列是预定义的 Azure Mobile Id。只要我在本地同步数据库中存储了具有相同 ID 的用户,一切都可以正常工作。
有一次,如果我丢失了这个本地Db信息(可能是重装app或者删除app数据造成的)。用户将提示重新登录,虽然我获得了相同的 Azure 身份验证 ID,但 snyc 将导致新插入到 Azure 用户 table。因为它不知道这是一个现有的行。
可能的解决方案是将 userAuthId 作为 PK(最终它是唯一的)。但如果我这样做,我将失去 azure 移动同步功能,不是吗?有人可以帮我照亮如何为 Azure 移动同步制作自定义 ID 列吗?或者不是自动生成,我可以传递来自客户端的值。
我之前遇到过类似的问题,我只是将我的用户 table 中的 Id
列的值设置为 UserAuthId
。为了添加额外的 UserAuthId
并将其用作其他 table 中的外键,我假设用户登录后,您需要检查在线 Users
table 并尝试要根据当前 UserAuthId
检索现有用户记录,那么您可以 insert/update 您的本地数据存储或直接更新您的在线 Users
table。此外,我建议您阅读 Adrian Hall 关于使用 Xamarin 开发 Azure 移动应用程序的书 here。
根据 Bruce Chen 的建议,我自己找到了解决方案。基本上只需删除默认值或绑定,如图所示,并在您的后端 Api 更改 Post 函数,如下所示,您的控制器还应通过调用 ClaimsPrincipal 从身份验证中检索 UserId,如下所示。使用此方法,您可以在 Api 中获得经过身份验证的 UserId。您可以在 this github link 上看到完整的实现。因此,您可以将其作为 table 的 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;
}
}
我在我的 xamarin 表单应用程序中使用 azure 移动应用程序进行身份验证,一旦我检索到唯一的用户身份验证 ID,我就会将其与其他用户信息一起存储到名为用户的同步 table 中,如下所示.
所以基本上我也在我的应用程序中使用 Azure Mobile Sync。下面的 Id 列是预定义的 Azure Mobile Id。只要我在本地同步数据库中存储了具有相同 ID 的用户,一切都可以正常工作。
有一次,如果我丢失了这个本地Db信息(可能是重装app或者删除app数据造成的)。用户将提示重新登录,虽然我获得了相同的 Azure 身份验证 ID,但 snyc 将导致新插入到 Azure 用户 table。因为它不知道这是一个现有的行。 可能的解决方案是将 userAuthId 作为 PK(最终它是唯一的)。但如果我这样做,我将失去 azure 移动同步功能,不是吗?有人可以帮我照亮如何为 Azure 移动同步制作自定义 ID 列吗?或者不是自动生成,我可以传递来自客户端的值。
我之前遇到过类似的问题,我只是将我的用户 table 中的 Id
列的值设置为 UserAuthId
。为了添加额外的 UserAuthId
并将其用作其他 table 中的外键,我假设用户登录后,您需要检查在线 Users
table 并尝试要根据当前 UserAuthId
检索现有用户记录,那么您可以 insert/update 您的本地数据存储或直接更新您的在线 Users
table。此外,我建议您阅读 Adrian Hall 关于使用 Xamarin 开发 Azure 移动应用程序的书 here。
根据 Bruce Chen 的建议,我自己找到了解决方案。基本上只需删除默认值或绑定,如图所示,并在您的后端 Api 更改 Post 函数,如下所示,您的控制器还应通过调用 ClaimsPrincipal 从身份验证中检索 UserId,如下所示。使用此方法,您可以在 Api 中获得经过身份验证的 UserId。您可以在 this github link 上看到完整的实现。因此,您可以将其作为 table 的 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;
}
}