AspIdentity EF和UserName

时间:2017-04-26 01:01:15

标签: entity-framework asp.net-identity

我已经使用Entity Framework实现了我认为相当标准的ASP身份。我已经为标准的AspNetUser表添加了几个属性,但我将用户名列作为不可为空的列。

但是当SignInManager处理PasswordSignInAsync时,它会生成以下sql:

SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[FullName] AS [FullName], 
[Extent1].[ClientId] AS [ClientId], 
[Extent1].[FirstName] AS [FirstName], 
[Extent1].[LastName] AS [LastName], 
[Extent1].[DateCreated] AS [DateCreated], 
[Extent1].[UserOid] AS [UserOid], 
[Extent1].[Email] AS [Email], 
[Extent1].[EmailConfirmed] AS [EmailConfirmed], 
[Extent1].[PasswordHash] AS [PasswordHash], 
[Extent1].[SecurityStamp] AS [SecurityStamp], 
[Extent1].[PhoneNumber] AS [PhoneNumber], 
[Extent1].[PhoneNumberConfirmed] AS [PhoneNumberConfirmed], 
[Extent1].[TwoFactorEnabled] AS [TwoFactorEnabled], 
[Extent1].[LockoutEndDateUtc] AS [LockoutEndDateUtc], 
[Extent1].[LockoutEnabled] AS [LockoutEnabled], 
[Extent1].[AccessFailedCount] AS [AccessFailedCount], 
[Extent1].[UserName] AS [UserName]
FROM [dbo].[AspNetUsers] AS [Extent1]
WHERE 
(
    UPPER([Extent1].[UserName]) = UPPER(@p__linq__0)
) 
OR 
(
    (UPPER([Extent1].[UserName]) IS NULL) 
    AND (UPPER(@p__linq__0) IS NULL)
)

任何人都可以告诉我以下内容: 1.当用户名不能为空时,为什么EF在where子句中生成Is NULL子句? 2.如何阻止这一点。 3.无论如何都要停止用户名的上层语句?

1 个答案:

答案 0 :(得分:0)

1)这个额外的子句将被SQL Server(假设这是你使用的)优化引擎淘汰。但我怀疑这是以这种方式生成的,因为您的EF模型没有[Required]装饰Username属性。 Username是一个字符串,.Net中的字符串可以为null。当EF生成查询时,它不会检查每个列类型 - 它会查看模型(类),因此在EF眼中,您的Username列可以为空。

这是使用迁移的一个很好的理由,而不是手动修改底层数据库。

2)您看到Upper,因为这是linq查询在Identity(source中的底层存储中写入的方式,搜索FindByNameAsync):

    public virtual Task<TUser> FindByNameAsync(string userName)
    {
        ThrowIfDisposed();
        return GetUserAggregateAsync(u => u.UserName.ToUpper() == userName.ToUpper());
    }

.ToUppse()这里将由EF翻译成SQL中的Upper

您可以通过实施自己的UserStore来避免这种情况。但这对于它的价值来说可能是太多的工作。