前提・実現したいこと
ASP.NET Coreでユーザが複数の店舗情報を持つDBの作成をしています。
店舗テーブルに、ユーザのIDを持たせ、所有者がわかるようにします。
店舗テーブルに、認証機能のユーザID(AspNetUsers.Id)を持たせようとしましたが、
IdはGUIDで長く読みにくい為、int型に変更して自動採番をさせようとしました。
ただ、AspNetUsers.Idをint型などにすると、Roleなど他のテーブルへの影響があり、
nvarchar型のままでユニークで短い文字列を生成するよりは、クラスを継承して
int UserId(auto increment)を追加する事にしました。
※認証系は既存のAspNetUsers.Id(GUID)で扱い、
ビジネスロジック系はAspNetUsers.UserId(int)で識別するという事です。
認証機能の登録の過程の「Click here to confirm your account」をクリックするとエラーになってしまいます。
対処・対応の方法として、次の4パターンを考えました。
1.店舗レコードへ書くUser識別を諦めてGUIDにしておく(できれば避けたい)
2.ユーザIDをGUIDなくロジックで生成する(重複なく生成する必要がある)
3._userManager.ConfirmEmailAsyncでUserIdの項目が更新対象になっている(からエラーになると思われる)ので、ここを見直す(方法が分からない)
4.更新対象のレコード・カラムをピンポイント(SQL文を発行)で更新する(ここだけSQL?)
「2.」の方法で確実にIdを生成する方法が思いつきません
→Count+1とか、ランダム生成して重複してないかチェックするのは賢いとは思えない
「3.」のケースで特定の項目だけ更新の対象外にする方法とかがあるのでしょうか?
※個人的には「2.」でうまく生成できる方法が後々にも楽なのかと思っています。
やった事
・ASP.MET COREでWEBアプリケーションを作成(認証は無しで作成)。
・新規スキャフォールディングでIDを指定し認証を有効にする(すべてのファイルをオーバーライド)。
・認証のユーザクラスIdentityUserに対して継承を行い、App01FindUserを作成しUserIdを追加。この項目をDatabaseGeneratedOption.Identityでauto incrementに指定↓
C#
1public class App01FindUser : IdentityUser 2{ 3 [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 4 public int UserId { get; set; } 5}
・ユーザを登録し、「Click here to confirm your account」をクリックするとエラーになります。
Email Confirmは、下記の「エラーが発生する該当のソースコード」に載せてあります。
新規スキャフォールディングでオーバーライドしてから何も変更していません。
(userIdという変数がありますが、元々あり今回のUserIdとは正しく区別されてるようです)
※データは実際に登録されています。
※UserIdはauto increment指定なので、設定不要という認識で一切値を設定していません。
発生している問題・エラーメッセージ
エラーが発生する該当のソースコード
ConfirmEmail.cshtml.cs
C#
1namespace App01Find.Areas.Identity.Pages.Account 2{ 3 [AllowAnonymous] 4 public class ConfirmEmailModel : PageModel 5 { 6 private readonly UserManager<App01FindUser> _userManager; 7 8 public ConfirmEmailModel(UserManager<App01FindUser> userManager) 9 { 10 _userManager = userManager; 11 } 12 13 [TempData] 14 public string StatusMessage { get; set; } 15 16 public async Task<IActionResult> OnGetAsync(string userId, string code) 17 { 18 if (userId == null || code == null) 19 { 20 return RedirectToPage("/Index"); 21 } 22 23 var user = await _userManager.FindByIdAsync(userId); 24 if (user == null) 25 { 26 return NotFound($"Unable to load user with ID '{userId}'."); 27 } 28 29 code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); 30 var result = await _userManager.ConfirmEmailAsync(user, code); //←ここでエラー 31 StatusMessage = result.Succeeded ? "Thank you for confirming your email." : "Error confirming your email."; 32 return Page(); 33 } 34 } 35}
補足情報(FW/ツールのバージョンなど)
Visual Studio 2019
ASP.NET CORE 5
うまくいかなかった原因
回答者の協力により、下記の事が分りました。
AspNetUsersの更新は、変更箇所以外のカラムもすべて更新対象としており、auto incrementのカラムはエラーになる事がわかりました。
コーディングの量に対して効果が低いので、auto incrementのカラムは諦めました。
回答1件
あなたの回答
tips
プレビュー