0

我正在尝试将使用 .net core sdk 2.2 构建的自包含应用程序发布到 ubuntu 18.04-x64。该应用程序通过Pomelo.EntityFrameworkCore.MySql连接到 MySQL并且通常运行良好,但我注意到 EntityFrameworkCore 构建 SQL 查询的方式有所不同。在我的开发机器上,以下代码

        var parameters = new object[]
        {
            new MySqlParameter("count", count)
        };

        return _dbContext.Posts
            .OrderByDescending(x => x.DateCreated)
            .Select(x => new SuggestionsViewModel()
            {
                Id = x.Id,
                Title = x.Title

            }).FromSql(Sql.GetSuggestions, parameters);

转化为查询

[INF] Executed DbCommand (0ms) [Parameters=[count='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
SELECT `x`.`Title`, `x`.`DateCreated`, `x`.`Id` 
FROM ( SELECT
            x.Id,
            x.Title,
            x.DateCreated 
        FROM
            Posts x
        WHERE    
            x.Picked = 1
        ORDER BY
            rand()
        LIMIT
            @count ) AS `x` ORDER BY `x`.`DateCreated` DESC

其中括号中的查询是常量 Sql.GetSuggestions。在生产中,只有内部查询被发送到数据库,并且在 sql 日志行之前会出现警告:

[INF] Entity Framework Core 2.2.6-servicing-10079 initialized 'ApplicationDbContext' using provider 'Pomelo.EntityFrameworkCore.MySql' with options: None
[WRN] The LINQ expression 'orderby [x].DateCreated desc' could not be translated and will be evaluated locally.
[INF] Executed DbCommand (1ms) [Parameters=[count='?' (DbType = Int32)], CommandType='"Text"', CommandTimeout='30']
    SELECT
        x.Id,
        x.Title,
        x.DateCreated 
    FROM
        Posts x
    WHERE    
        x.Picked = 1
    ORDER BY
        rand()
    LIMIT
        @count

该应用程序是使用以下命令构建和发布的:

dotnet build --configuration Release --runtime "ubuntu.18.04-x64" --force
dotnet publish --configuration Release --self-contained true --runtime "ubuntu.18.04-x64"

使用 2.2.110 .net core sdk

现在有些奇怪:当我将存储库拉到 ubuntu 并使用相同的 SDK 和相同的命令在服务器上构建时,查询构造符合预期。我的开发机器是带有 IDE Visual Studio 2017 的 Win10Enterprise。

我究竟做错了什么?

4

1 回答 1

0

我能够通过您提供的步骤重现该问题。这可能是 EF Core 2.2 问题。


无论是在 .NET Core 3.1 还是 2.2 下运行,它都能与 EF Core 3.1.7 和 Pomelo 3.1.2 完美配合。


因此,您应该强烈考虑将 Pomelo 和 EF Core 升级到3.1.x. 两者都兼容 .NET Standard 2.0,这意味着它们也兼容 .NET Core 2.2。有关我们的兼容性矩阵,请参阅兼容性:依赖项

我无法升级:Microsoft.AspNetCore.App 2.2 需要 EF Core 2.2

可以将 EF Core 3.1 与 ASP.NET Core 2.2 结合使用。看看我另一个答案的开头。

基本上,Microsoft.AspNetCore.App包只是一个元包,它引用了很多不同的包,所以你不必自己做。但是,没有人会阻止您手动引用实际的包,或者只是Microsoft.AspNetCore.App用您想要的包覆盖引用的默认包版本。链接答案的第一部分证明了这一点。

于 2020-09-09T12:51:23.183 回答