问题描述
我正在尝试将使用.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)],CommandTimeout='30']
SELECT
x.Id,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核心SDK
现在这里有些奇怪:当我将存储库拉到ubuntu并使用相同的SDK和相同的命令在服务器上构建时,查询将按预期的方式构建。我的开发机器是带有IDE Visual Studio 2017的Win10Enterprise。
我在做什么错了?
解决方法
我能够按照您提供的步骤重现该问题。这可能是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兼容。有关兼容性矩阵,请参见Compatibility: Dependencies。
我无法升级:Microsoft.AspNetCore.App 2.2需要EF Core 2.2
您可以将EF Core 3.1与ASP.NET Core 2.2结合使用。 看看我在another answer上的开头。
基本上,Microsoft.AspNetCore.App
包只是一个meta包,它引用了许多不同的包,因此您不必自己执行此操作。但是,没有人阻止您手动引用实际的软件包,或者只是将Microsoft.AspNetCore.App
引用的默认软件包版本替换为所需的软件包版本。链接答案的第一部分对此进行了演示。