我有一个解决方案是在.NET 5上运行的,最近我把它更新到了.NET 6。我还把我所有的Nuget包更新到了最新版本。Microsoft.EntityFrameworkCore和相关包的版本是6. 0. 9。
当我在本地MySQL数据库(版本5.7.12)上运行更新后的项目时,它运行得很好。
但在非开发环境中,我们连接到AWS的MySQL RDS数据库(相同版本)。当我尝试连接到RDS时,事情变得很奇怪。在任何项目中,在做任何真实的工作之前,我们都会记录一些事情。我看到的是,第一条消息将按预期记录。但第二个调用在调用SaveChanges()时挂起。调用永远不会完成。
嗯,几乎从来没有。有一次它确实通过了,我在下一次数据库调用时看到了这个错误:
Microsoft.EntityFrameworkCore.Infrastructure[10404]
A transient exception occurred during execution. The operation will be retried after 0ms.
MySqlConnector.MySqlException (0x80004005): Connect Timeout expired.
顺便说一句,重新连接的尝试没有成功。我想它就像其他的一样挂着。
我创建的数据库上下文如下所示:
services.AddDbContext<LoggingDbContextAdapter>(optionsBuilder =>
{
optionsBuilder.UseLazyLoadingProxies(false)
.UseMySql(connStr, ServerVersion.AutoDetect(connStr), mysqlOptions =>
{
});
});
我们使用依赖项注入,并且所有存储库都是 transient 的。我不认为问题出在RDS设置上,因为我们已经连接到这个示例很多年了。问题似乎与程序集升级有关,因为如果我将.NET 5更改为.NET 6,但保留所有程序集不变,我没有这个问题(但我确实有其他问题需要我升级与数据库相关的程序集)。我知道没有太多工作要做,但是有没有人知道为什么会发生这种情况?据我所知,对于使用.NET 6并连接到RDS的人来说,这并不是一个普遍存在的问题。
1条答案
按热度按时间y1aodyip1#
我从来没有弄清楚到底是怎么回事。但我确实解决了这个问题,用MySql.Data.EntityFrameworkCore替换了Pomelo实体框架提供程序。当我创建一个简单的测试项目时,我发现这是可行的,并发现我在使用Pomelo时遇到了同样的问题,但Oracle提供程序没有。
我不得不更新大量的代码来让Oracle提供程序在我的应用程序中的任何地方都能正常工作,所以这是相当痛苦的,但这是我能找到的唯一前进的道路。