質問編集履歴

3

原因究明により、タイトルの見直しとまとめの追加

2021/02/24 05:47

投稿

woodcube
woodcube

スコア32

test CHANGED
@@ -1 +1 @@
1
- ASP.NET自動採番のカラムがあるテーブル更新するとエラーになる
1
+ ASP.NETの認証機能のAspNetUsersテーブルに自動採番(identity)のカラムを追加すると更新時にエラーになる
test CHANGED
@@ -185,3 +185,15 @@
185
185
  Visual Studio 2019
186
186
 
187
187
  ASP.NET CORE 5
188
+
189
+
190
+
191
+ ### うまくいかなかった原因
192
+
193
+ 回答者の協力により、下記の事が分りました。
194
+
195
+
196
+
197
+ AspNetUsersの更新は、変更箇所以外のカラムもすべて更新対象としており、auto incrementのカラムはエラーになる事がわかりました。
198
+
199
+ コーディングの量に対して効果が低いので、auto incrementのカラムは諦めました。

2

Email Confirmの実装を追記しました

2021/02/24 05:47

投稿

woodcube
woodcube

スコア32

test CHANGED
File without changes
test CHANGED
@@ -80,6 +80,12 @@
80
80
 
81
81
  ・ユーザを登録し、「Click here to confirm your account」をクリックするとエラーになります。
82
82
 
83
+ Email Confirmは、下記の「エラーが発生する該当のソースコード」に載せてあります。
84
+
85
+ 新規スキャフォールディングでオーバーライドしてから何も変更していません。
86
+
87
+ (userIdという変数がありますが、元々あり今回のUserIdとは正しく区別されてるようです)
88
+
83
89
  ※データは実際に登録されています。
84
90
 
85
91
  ※UserIdはauto increment指定なので、設定不要という認識で一切値を設定していません。
@@ -98,21 +104,75 @@
98
104
 
99
105
  ```C#
100
106
 
101
- public async Task<IActionResult> OnGetAsync(string userId, string code)
107
+ namespace App01Find.Areas.Identity.Pages.Account
102
108
 
103
109
  {
104
110
 
105
- //一部省略
111
+ [AllowAnonymous]
106
112
 
107
- code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));
113
+ public class ConfirmEmailModel : PageModel
108
114
 
109
- var result = await _userManager.ConfirmEmailAsync(user, code); //←ここでエラー
115
+ {
110
116
 
111
- StatusMessage = result.Succeeded ? "Thank you for confirming your email." : "Error
117
+ private readonly UserManager<App01FindUser> _userManager;
112
118
 
113
- confirming your email.";
114
119
 
120
+
121
+ public ConfirmEmailModel(UserManager<App01FindUser> userManager)
122
+
123
+ {
124
+
125
+ _userManager = userManager;
126
+
127
+ }
128
+
129
+
130
+
131
+ [TempData]
132
+
133
+ public string StatusMessage { get; set; }
134
+
135
+
136
+
137
+ public async Task<IActionResult> OnGetAsync(string userId, string code)
138
+
139
+ {
140
+
141
+ if (userId == null || code == null)
142
+
143
+ {
144
+
145
+ return RedirectToPage("/Index");
146
+
147
+ }
148
+
149
+
150
+
151
+ var user = await _userManager.FindByIdAsync(userId);
152
+
153
+ if (user == null)
154
+
155
+ {
156
+
157
+ return NotFound($"Unable to load user with ID '{userId}'.");
158
+
159
+ }
160
+
161
+
162
+
163
+ code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));
164
+
165
+ var result = await _userManager.ConfirmEmailAsync(user, code); //←ここでエラー
166
+
167
+ StatusMessage = result.Succeeded ? "Thank you for confirming your email." : "Error confirming your email.";
168
+
115
- return Page();
169
+ return Page();
170
+
171
+ }
172
+
173
+ }
174
+
175
+ }
116
176
 
117
177
  ```
118
178
 

1

実際に行った過程を詳しく書きました

2021/02/23 10:11

投稿

woodcube
woodcube

スコア32

test CHANGED
File without changes
test CHANGED
@@ -26,7 +26,7 @@
26
26
 
27
27
 
28
28
 
29
- 対処・対応の方法として
29
+ 対処・対応の方法として、次の4パターンを考えました。
30
30
 
31
31
  1.店舗レコードへ書くUser識別を諦めてGUIDにしておく(できれば避けたい)
32
32
 
@@ -50,7 +50,13 @@
50
50
 
51
51
 
52
52
 
53
- ### 拡張しカラム
53
+ ### やっ
54
+
55
+ ・ASP.MET COREでWEBアプリケーションを作成(認証は無しで作成)。
56
+
57
+ ・新規スキャフォールディングでIDを指定し認証を有効にする(すべてのファイルをオーバーライド)。
58
+
59
+ ・認証のユーザクラスIdentityUserに対して継承を行い、App01FindUserを作成しUserIdを追加。この項目をDatabaseGeneratedOption.Identityでauto incrementに指定↓
54
60
 
55
61
  ```C#
56
62
 
@@ -66,25 +72,37 @@
66
72
 
67
73
  ```
68
74
 
75
+ ・マイグレーションとアップデートを行い、テーブルを作成。
76
+
77
+ ![イメージ説明](2af1cbbdf774c0167c62362bd2d63f80.png)
78
+
79
+
80
+
81
+ ・ユーザを登録し、「Click here to confirm your account」をクリックするとエラーになります。
82
+
83
+ ※データは実際に登録されています。
84
+
85
+ ※UserIdはauto increment指定なので、設定不要という認識で一切値を設定していません。
86
+
69
87
 
70
88
 
71
89
  ### 発生している問題・エラーメッセージ
72
90
 
73
-
74
-
75
- ```
76
-
77
- SqlException: Cannot update identity column 'UserId'.
91
+ ![イメージ説明](31c616506c15483cf9847ea087d2897f.png)
78
-
79
- ```
80
92
 
81
93
 
82
94
 
83
- ### 該当のソースコード
95
+ ### エラーが発生する該当のソースコード
84
96
 
85
-
97
+ ConfirmEmail.cshtml.cs
86
98
 
87
99
  ```C#
100
+
101
+ public async Task<IActionResult> OnGetAsync(string userId, string code)
102
+
103
+ {
104
+
105
+ //一部省略
88
106
 
89
107
  code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code));
90
108