【问题标题】:Timeout error on running Scaffold-DbContext运行 Scaffold-DbContext 时出现超时错误
【发布时间】:2019-02-25 20:42:34
【问题描述】:

我们使用数据优先的方法,并使用 Scaffol-Dbcontext 对数据上下文进行逆向工程。

数据库是 MySQL,我们使用 Pomelo 作为提供者。

283个数据库版本一直运行良好,但现在命令崩溃并报错:

命令超时在操作完成之前到期。

这是我使用的命令:

Scaffold-DbContext "server=localhost;userid=user;pwd=pass;port=3306;database=db_name;sslmode=none;" "Pomelo.EntityFrameworkCore.MySql" -d -o "OutputFolder" -v -f -context “上下文名称”

这是完整的堆栈跟踪:

MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed. ---> MySql.Data.MySqlClient.MySqlException (0x80004005): The Command Timeout expired before the operation completed.
   at MySqlConnector.Protocol.Serialization.BufferedByteReader.ReadBytesAsync(IByteHandler byteHandler, ArraySegment`1 buffer, Int32 totalBytesToRead, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\BufferedByteReader.cs:line 36
   at MySqlConnector.Protocol.Serialization.ProtocolUtility.ReadPacketAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 406
   at MySqlConnector.Protocol.Serialization.ProtocolUtility.DoReadPayloadAsync(BufferedByteReader bufferedByteReader, IByteHandler byteHandler, Func`1 getNextSequenceNumber, ArraySegmentHolder`1 previousPayloads, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\ProtocolUtility.cs:line 459
   at MySqlConnector.Protocol.Serialization.StandardPayloadHandler.ReadPayloadAsync(ArraySegmentHolder`1 cache, ProtocolErrorBehavior protocolErrorBehavior, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Protocol\Serialization\StandardPayloadHandler.cs:line 37
   at MySqlConnector.Core.ServerSession.ReceiveReplyAsync(IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 645
--- End of stack trace from previous location where exception was thrown ---
   at MySqlConnector.Core.ServerSession.TryAsyncContinuation(Task`1 task) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 1230
   at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
--- End of stack trace from previous location where exception was thrown ---
   at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
   at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 42
   at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet(ResultSet resultSet) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 74
   at MySql.Data.MySqlClient.MySqlDataReader.ReadFirstResultSetAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 299
   at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(MySqlCommand command, CommandBehavior behavior, ResultSetProtocol resultSetProtocol, IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 284
   at MySqlConnector.Core.TextCommandExecutor.ExecuteReaderAsync(String commandText, MySqlParameterCollection parameterCollection, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\TextCommandExecutor.cs:line 37
   at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 252
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.GetConstraints()
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.Create(DbConnection connection, IEnumerable`1 tables, IEnumerable`1 schemas)
   at Pomelo.EntityFrameworkCore.MySql.Scaffolding.Internal.MySqlDatabaseModelFactory.Create(String connectionString, IEnumerable`1 tables, IEnumerable`1 schemas)
   at Microsoft.EntityFrameworkCore.Scaffolding.Internal.ReverseEngineerScaffolder.ScaffoldModel(String connectionString, IEnumerable`1 tables, IEnumerable`1 schemas, String namespace, String language, String contextDir, String contextName, ModelReverseEngineerOptions modelOptions, ModelCodeGenerationOptions codeOptions)
   at Microsoft.EntityFrameworkCore.Design.Internal.DatabaseOperations.ScaffoldContext(String provider, String connectionString, String outputDir, String outputContextDir, String dbContextClassName, IEnumerable`1 schemas, IEnumerable`1 tables, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContextImpl(String provider, String connectionString, String outputDir, String outputDbContextDir, String dbContextClassName, IEnumerable`1 schemaFilters, IEnumerable`1 tableFilters, Boolean useDataAnnotations, Boolean overwriteFiles, Boolean useDatabaseNames)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.ScaffoldContext.<>c__DisplayClass0_1.<.ctor>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

相关包版本:

  • Microsoft.AspNetCore.All 2.1.4
  • Pomelo.EntityFrameworkCore.MySql 2.1.2

请务必注意,这只发生在我的计算机上(VS Professional 2017 v15.8.5)。其他同事可以运行相同的命令,并备份我的数据库,而不会出现任何错误。

你能指出我正确的方向吗?到目前为止,我已经测试过(没有成功):

  • 更新所有包。
  • 更新 Visual Studio
  • 删除 nuget 文件夹并恢复包
  • 尝试了多个数据库(有些可以,有些不行,但不确定 它们有什么区别)
  • 将“Connect timeout=300”属性添加到连接字符串 (同样的错误,但需要 5 分钟)

【问题讨论】:

  • 听起来像网络问题。您是否尝试停用防火墙?您的数据库在同一台计算机上吗(我看到一个本地主机)?
  • 感谢您的建议。刚刚尝试禁用nod32防火墙,问题仍然存在。是的,数据库服务器与 Visual Studio 在同一台计算机上。
  • 您可能想要显示全局变量,例如 '%time%';看看有没有什么东西给你敲响了。
  • @WilsonHauck 没什么奇怪的。尝试设置更大的 connect_timeout 值,但结果相同。

标签: c# mysql entity-framework-core


【解决方案1】:

下次尝试添加

  1. 连接超时=300(以秒为单位的时间)
  2. 默认命令超时=300(时间以秒为单位)

尝试以下连接字符串:

dotnet ef dbcontext scaffold "server=simycotest.ddns.net;userid=xxxxx;password=xxxxx;database=xxxxx;Connection Timeout=300;default command timeout=300" "Pomelo.EntityFrameworkCore.MySql" -o .\DbModels -f

更多关于connection string in MySql的信息

【讨论】:

    【解决方案2】:

    抱歉,这个答案并没有像预期的那样解决问题,但我需要在星期一工作,所以我走上了懦夫之路:

    卸载与 Visual Studio 和 MySQL 相关的所有内容并重新安装后一切正常。

    它还将 Scaffold-DbContext 运行所需的时间从约 3 分钟减少到约 10 秒。

    仅作记录,我上次的测试证明,仅导入 1 个具有 5 个以上 FK 约束的表,该过程会失败。删除任何 FK 都会使该过程正常工作...

    我的直觉告诉我是某个地方的某些损坏的包导致了这种情况。

    【讨论】:

      猜你喜欢
      • 2020-02-24
      • 1970-01-01
      • 2021-12-26
      • 1970-01-01
      • 2021-03-23
      • 2015-11-04
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多