我正在使用 MassTransit(使用 RabbitMQ)和 Automatonymous 开发一个传奇。我使用 EntityFramework 作为我的存储引擎和 MySQL 作为我的数据库。每次我尝试运行 saga 并将其状态存储在数据库中时,EF 和 MySQL 的组合都会引发异常。使用此示例应用程序并使用 MySQL 数据库的连接字符串可以重现该问题。抛出的确切异常是:
System.Data.SqlClient.SqlException (0x80131904):建立与 SQL Server 的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供者:命名管道提供者,错误:40 - 无法打开与 SQL Server 的连接)---> Syste m.ComponentModel.Win32Exception (0x80004005):系统找不到在 System.Data.SqlClient.SqlInternalConnectionTds 指定的文件。 .ctor(DbConnectionPoolIdentity 身份,SqlConnectionString connectionOptions,SqlCredential 凭证,对象 providerInfo,String newPassword,SecureString newSecurePassword,布尔重定向用户实例,SqlConnectionString userConnectionOptions,SessionData reconnectSessionData,
1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource
1 次重试,DbConnectionOptions userOptions,DbConnectionInternal oldConnection,Db ConnectionInternal& connection) 在 System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,TaskCompletionSource1 retry, DbConnectionOptions use rOptions) at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource
1 重试,DbConnectionOptions userOptions) 在 System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource1 retry) at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource
1重试)在 System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.b__36(DbConnection t, DbConnectionInterceptionContext c) 在 System.Data.Entity.Infrastructure.Interception.InternalDispatcher1.Dispatch[TTarget,TInterceptionContext](TTarget target, Action
2 操作的 System.Data.SqlClient.SqlConnection.Open() 处, TInterceptionContext 拦截上下文,动作3 executing, Action
3 执行)在 System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext) 在 System.Data.Entity.SqlServer.SqlProviderServices.<>c__DisplayClass33.b__32() 在 System.Data.Entity.SqlServer .DefaultSqlExecutionStrategy.<>c__DisplayClass1.b__0() at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation) at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute(Action operation) at System.Data.Entity.SqlServer.SqlProviderServices.UsingConnection(DbConnection sqlConnection, Action
1 act) at System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action1 act) at System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable
1 commandTimeout, System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase 处的 DbConnection sqlConnection,String createDatabaseScript)(DbConnection 连接,可空1 commandTimeout, StoreItemCollection storeItemCollection) at System.Data.Entity.Core.Common.DbProviderServices.CreateDatabase(DbConnection connection, Nullable
1 commandTimeout, StoreItemCollection storeItemCollection) 在 System.Data.Entity.Migrations.DbMigrator System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection 连接) 在 System.Data.Entity.Core.Objects.ObjectContext.CreateDatabase() .EnsureDatabaseExists(Action mustSucceedToKeepDatabase) 在 System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func3 createMigrator, ObjectContext objectContext) at System.Data.Entity.Internal.InternalContext.CreateDatabase(ObjectContext objectContext, DatabaseExistenceState existenceState) at System.Data.Entity.Database.Create(DatabaseExistenceState existenceState) at System.Data.Entity.CreateDatabaseIfNotExists
1.InitializeDatabase(TContext context) 在 System.Data.Entity.Migrations.DbMigrator.Update(String targetMigration) 在 System.Data .Entity.Internal.InternalContext.<>c__DisplayClassf 1.PerformAction1.<CreateInitializationAction>b__e() at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action) at System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization() at System.Data.Entity.Internal.LazyInternalContext.<InitializeDatabase>b__4(InternalContext c) at System.Data.Entity.Internal.RetryAction
(TInput 输入) 在 System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action1 action) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() at System.Data.Entity.Internal.LazyInternalContext.get_ObjectContext() at System.Data.Entity.Database.BeginTransaction(IsolationLevel isolationLevel) at MassTransit.EntityFrameworkIntegration.Saga.EntityFrameworkSagaRepository
1.d__81.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at MassTransit.Saga.Pipeline.Filters.QuerySagaFilter
2.>-Send>d__6.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪 --- 在 MassTransit.Saga.Pipeline.Filters.QuerySagaFilter 的 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()2.<MassTransit-Pipeline-IFilter<MassTransit-ConsumeContext<TMessage>>-Send>d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at MassTransit.Saga.Pipeline.Filters.CorrelationIdMessageFilter
1.d__3.MoveNext() --- 从先前引发异常的位置结束堆栈跟踪---在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务)在 MassTransit.Pipeline.Filters.TeeConsumeFilter 的 System.Runtime.CompilerServices.TaskAwaiter.GetResult()1.<>c__DisplayClass7_0.<<Send>b__0>d.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at MassTransit.Pipeline.Filters.TeeConsumeFilter
1.d__7.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task任务)在 MassTransit.Pipeline.Filters.MessageConsumeFilter 的 System.Runtime.CompilerServices.TaskAwaiter.GetResult()1.<MassTransit-Pipeline-IFilter<MassTransit-ConsumeContext>-Send>d__7.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at MassTransit.Pipeline.Filters.MessageConsumeFilter
1.-Send>d__7.MoveNext() --- 在 System.Runtime.CompilerServices.TaskAwaiter 的 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 处从先前引发异常的位置结束堆栈跟踪。 HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at MassTransit.Pipeline.Filters.DeserializeFilter.d__4.MoveNext() --- 从先前抛出异常的位置结束堆栈跟踪---在系统.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter.GetResult() at MassTransit.Pipeline.Filters.RescueReceiveContextFilter`1.-发送>d__5.MoveNext() ClientConnectionId:00000000-0000-0000-0000-000000000000 错误编号:2,状态:0,类别:20
如果我使用与 VS 2015 一起安装的本地数据库而不是 MySQL,那么它工作得非常好。它也适用于内存存储。即使异常说找不到服务器,我也可以确认它存在并且可以访问,因为示例应用程序在选择连接字符串时首先进行检查并且成功:
using (var connection = new SqlConnection(connectionString))
{
// It worked, we can save this as our connection string
return connectionString;
}
问题是否可能是因为它试图使用 SqlClient 访问 MySQL 数据库?
我正在使用 MySQL Server 5.7、EF 6.1.3、MassTransit 3.5.7 和 Automatonymous 3.5.11。