質問: result.Succeeded ? "Thank you for confirming your email." : "Error confirming your email."; return Page(); } } } ``` ### 補足情報(FW/ツールのバージョンなど) Visual Studio 2019 ASP.NET CORE 5 ### うまくいかなかった原因 回答者の協力により、下記の事が分りました。 AspNetUsersの更新は、変更箇所以外のカラムもすべて更新対象としており、auto incrementのカラムはエラーになる事がわかりました。 コーディングの量に対して効果が低いので、auto incrementのカラムは諦めました。
回答: まずエラーになる原因ですが、質問者さんが質問に書いた、 > > 3._userManager.ConfirmEmailAsyncでUserIdの項目が更新対象になっている(からエラーになると思われる)ので、ここを見直す(方法が分からない) > > > というのはその通りのようで、ConfirmEmailAsync メソッドで Identity の UserId フィールドも更新しようとするからのようです。 以下の画像は EF Core のログを Visual Studio の「出力」ウィンドウに表示できるようにし、ユーザー登録後に RegisterConfirmation ページのリンク "Click here to confirm your account" をクリックして ConfirmEmail ページを呼び出し、_userManager.ConfirmEmailAsync(user, code) を実行したときのものです。 !イメージ説明 AspNetUsers テーブルの EmailConfirmed フィールドのみ false ⇒ ture に更新すれば良いところ、他のフィールドにも更新前と同じ値が渡されて UPDATE されています。 上の画像の例では、プロファイル情報に HandleName を追加しています。それにも値が渡され UPDATE されています。上の例は、質問者さんのケースと違って Identity 列ではなく、ただの NVARCHAR(128) なので問題なく UPDATE できています。 「ここを見直す」には ConfirmEmailAsync メソッドの実装を書き直す他ありませんが、それは現実的ではなさそうです。無理にやったとしても、直すのはそこだけでなく、Account/Manage/Index 他のページでユーザー情報の更新を行うときに使う _userManager.UpdateAsync(user) なども直さないと同じ問題が出ます。 !イメージ説明 というわけで現実的なのは、追加プロファイル情報 UserId を Identity にするのをやめて普通に int 型にしておき、 > > 2.ユーザIDをGUIDなくロジックで生成する(重複なく生成する必要がある) > > > という選択肢になるかと思います。(他の選択肢 1 と 4 はやる気はないと理解) > > 「2.」の方法で確実にIdを生成する方法が思いつきません > > →Count+1とか、ランダム生成して重複してないかチェックするのは賢いとは思えない > > > 「賢いとは思えない」とのことですが、Identity にできない以上は Register.cshtml.cs の実装の中で何とか重複してない Id を取得して設定する他なさそうです。 そこがどうしても気に入らなければ、選択肢 1 に戻るか、Id に代えて UserName を使うか(UserName は一意になるようになっています)、Id に int 型 Identity を使うよう ASP.NET Core Identity を独自実装する(以下の記事参照)ということになると思います。 ASP.NET Core Identity 独自実装(その1) 上の独自実装案が、質問者さんが質問のコメントに書いた、 > > 結局は、「AspNetUsers.Idへの値をGUIDでなく重複していない連番を振っていきたい」です。 > > > に近いものだと思います。だた、これに Role の実装と、さらには Email Confirmation の実装まで追加しないと望む形にはならないと思いますので、そこまで時間と労力をかけてやる価値があるかは疑問ですが。