我已经使用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.无论如何都要停止用户名的上层语句?
答案 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来避免这种情况。但这对于它的价值来说可能是太多的工作。