【问题标题】:Strange behaviour in Entity Framework Core with sqlite使用 sqlite 的 Entity Framework Core 中的奇怪行为
【发布时间】:2020-01-30 12:23:23
【问题描述】:

我有一个简单的DbContextSet<> 的用户。

我有一个带有身份验证的 ASP.NET Core Web API。

public User Authenticate(string username, string password)
{
    var user = _ctx.Users.FirstOrDefault(x => 
            x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) && 
            x.Password.Equals(password, StringComparison.OrdinalIgnoreCase));

    bool exists = _ctx.Users.Any(x =>
            x.Username.Equals(username, StringComparison.OrdinalIgnoreCase) &&
            x.Password.Equals(password, StringComparison.OrdinalIgnoreCase));

    bool usernameCorrect = _ctx.Users.First().Username.Equals(username, StringComparison.OrdinalIgnoreCase);
    bool passwordCorrect = _ctx.Users.First().Password.Equals(password, StringComparison.OrdinalIgnoreCase);

    if (user == null)
    {
        return null;
    }
    [...]
}

问题是_ctx.Users.FirstOrDefault返回null。

你可能认为这很简单:“条件不匹配”

但是:

这是怎么回事?

【问题讨论】:

    标签: c# sqlite entity-framework-core asp.net-core-webapi


    【解决方案1】:

    发生的情况是与 OrdinalIgnoreCase 的比较仅适用于物化对象。 (您的 IQueryable 提供程序不支持它)。 它适用于第 3 和第 4 种情况,因为您首先物化了对象。

    尝试改用string.Compare(string str1, string str2, StringComparison.OrdinalIgnoreCase) == 0

    【讨论】:

    • 这不起作用 ;(我得到了 entityframework 的异常说它无法翻译。
    • 但我明白了。 _ctx.Users.SingleOrDefault(x => x.Username.Equals(username) && x.Password.ToLower().Equals(password.ToLower())); 工作正常!
    • StringComparison.OrdinalIgnoreCase 通常是比较用户名和密码的不好做法,但如果你真的想要它,你可以将你的字符串转换为小写并使用正常的 == 来比较你的字符串作为一种解决方法
    • 我现在正在使用 md5 哈希。我想降低它们很好:P
    猜你喜欢
    • 2015-01-03
    • 2018-08-02
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 2016-10-25
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多