在 Entity Framework 核心 3.x 的身份中,如果未强制执行电子邮件唯一性,我如何通过电子邮件查找用户(注意规范化)?

In Identity for Entity Framework Core 3.x, how do I find users by Email (minding normalization) when Email uniqueness is not enforced?

userManager.FindByEmailAsync(myEmail) 如果有多个用户使用相同的电子邮件,则抛出异常。

我可以使用:

await context.ApplicationUsers
    .FirstOrDefaultAsync(x => x.NormalizedEmail == myEmail.ToUpperInvariant());

这似乎没问题。但我不确定 ToUpperInvariant 是否是正确的检查方法,因为 System.Text 也有 Normalize()。现在这无关紧要,因为我们使用 SQL 配置不区分大小写的服务器,但如果我们改变它,我不希望事情中断。

我的规范化方式是否与 Entity Framework 的做法一致?我试图找到源代码,但是 what I found 没有使用 NormalizedEmail 字段,所以它可能是旧的。

规范化不是由 EF Core 完成的,而是由 UserManager class(使用 ILookupNormalizer service injected via constructor or set via KeyNormalizer 属性)完成的。

UserManager.FindByEmailAsync 方法 does the normalization for you before calling the store method. The problem is that EF Core store method implementation uses SingleOrDefaultAsync 如果数据库中存在重复的规范化电子邮件,则会抛出该方法。

要解决此问题,您可以使用 UserManager.NormalizeEmail 方法进行规范化,然后使用示例中的 FirstOrDefaultAsync 查询:

var normalizedEmail = userManager.NormalizeEmail(myEmail);
var firstDuplicate = await userManager.Users
    .FirstOrDefaultAsync(x => x.NormalizedEmail == normalizedEmail);