2017-04-26 13 views
1

私は、Entity Frameworkを使用して、かなり標準的なASP IDと考えているものを実装しました。私は、標準のAspNetUserテーブルにいくつかのプロパティを追加しましたが、私はヌル値を持たないカラムとしてユーザ名カラムを持っています。 SignInManagerはPasswordSignInAsyncを処理するときAspIdentity EFとUserName

は、しかし、それは、次の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) 
) 

誰も私に次のように言うことができる: usernameはできません1.なぜEFは、where句であるNULL句を生成していますヌルですか? 2.これをやめる方法。 3. UsernameのUpperステートメントを停止する方法はありますか?

+0

_ "UsernameのUpperステートメントを停止するにはどうしますか?" - あなたの質問の中核があるのですが、なぜそれを聞いていますか?アイデンティティで大文字と小文字を区別するユーザ名を使用しますか? – CodeCaster

答えて

0

1)この余分な句は、SQL Server(これはあなたが使用していると仮定している)最適化エンジンによって排除されます。しかし、あなたのEFモデルにUsernameの飾り付けをしている[Required]がないので、これはこの方法で生成されたものと思われます。 Usernameは文字列で、.Netの文字列はnullでもかまいません。そして、EFがクエリを生成するとき、それはすべての列の型をチェックするのではなく、モデル(クラス)を調べるので、EFの目ではUsernameの列はNULL可能です。

これは、移行を使用し、基盤となるDBを手作業で変更しない場合の良い理由です。

2)これは、LINQクエリは、アイデンティティ(sourceFindByNameAsyncの検索)内の基礎記憶域に書かれている方法ですので、あなたがUpperを参照してください。ここ

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

.ToUppse()がでUpperにEFによって翻訳なっていますあなたのSQL。

これは、独自のUserStoreを実装することで回避できます。しかし、これは価値があるためにはあまりにも多くの仕事かもしれません。