2017-12-14 7 views
0

私はxamarinフォームアプリケーションでazureモバイルアプリケーションを使用して認証しています。一意のユーザー認証IDを取得すると、これを他のユーザー情報の束とともにUsersという同期テーブルに保存します。Azure Mobile SyncにカスタムID列がありますか?

私は基本的に私のアプリでAzure Mobile Syncも使用しています。下のId列はあらかじめ定義されたAzureモバイルIDです。 Local sync dbに保存されているIdを持つ同じユーザーがいる限り、すべて正常に動作します。

このローカルDb情報が失われた場合(これは、アプリの再インストールやアプリデータの削除によって発生する可能性があります)。ユーザーは再ログインを促しますが、同じAzure認証IDを取得しても、snycによってAzureユーザーテーブルに新しい挿入が行われます。それは、それが既存の行であることを知らないからです。 可能な解決策は、userAuthIdをPK(最終的には一意)として作成することです。しかし、私はそれを行う場合、私は晴れたモバイル同期機能を失うことはありません、私は?誰かが晴れた携帯電話の同期のためのカスタムID列を作る方法を私に光らせることができますか?または自動生成の代わりに、私はクライアントから値を渡すことができます。

enter image description here

答えて

1

私はちょうどUserAuthIdに私のusersテーブルにId列の値を設定し、前に同様の問題に遭遇しました。追加のUserAuthIdを追加してそれを他のテーブルの外部キーとして使用するには、ユーザログの後にオンラインのUsersテーブルをチェックし、現在のUserAuthIdに基づいて既存のユーザレコードを取得する必要があると仮定しました。ローカルのデータストアを更新するか、オンラインのUsersテーブルを直接更新してください。さらに、Xamarinを使ってAzure Mobile Appsを開発する方法については、adrian hallの書籍hereに従うことをお勧めします。

+0

IはIDとしてUserAuthIdを通過しようとしたが、それが挿入されています。私はsyncronizeするためにC#のバックエンドを使用しています、それは無視され、自動生成されます。もちろん一方向の解決策はカスタムapiを行うことですが、私はまだ自分自身で同期を処理するのではなく、空白のモバイル同期機能を維持したいと思います – batmaci

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

関連する問題