ASPのIdentityを利用していて、IdentityUserクラスのUserNameプロパティがUnique制約が付いてないにもかかわらず、重複値を入力できなかったため理由を調べてみました。
ソースは以下のValidateUserNameメソッドの部分が該当です。
var owner = await manager.FindByNameAsync(userName).ConfigureAwait(false);
if (
owner != null &&
!string.Equals(await manager.GetUserIdAsync(owner).ConfigureAwait(false), await manager.GetUserIdAsync(user).ConfigureAwait(false))
) {
errors.Add(Describer.DuplicateUserName(userName));
}
aspnetcore/src/Identity/Extensions.Core/src/UserValidator.cs at 05b2afb73b55b11d8cb3691dedfebba1f0285332 · dotnet/aspnetcore
ASP.NETCoreisacross-platform.NETframeworkforbuildingmoderncloud-basedwebapplicationsonWindows,Mac,orLinux.-dotnet/aspnetcore
バリデーションロジックの中で
FindByNameAsyncで取れるUserIdと更新対象のUserIdのチェックを行っているからですね。
FindByNameAsync自体がUserNameでユーザを引っ張ってきているため、複数ヒットや別ユーザが取れてしまう場合にエラーとなり、結果的に重複入力がブロックされるようです。
なおDB的にはUnique制約は付いてませんので、DbContextなどから直接UserNameの値を弄れば重複した値を入力すること自体は可能です。その場合、Identityの流儀を外れることになりますので、NormalizedUserNameなどの内部で利用している値などは更新されず、あとで痛い目を見ることになると思います。(なりましたw)
コメント