【问题标题】:asp.net core + ef6 + mysqlasp.net 核心 + ef6 + mysql
【发布时间】:2019-01-06 01:18:54
【问题描述】:

我正在尝试使用带有 Asp.Net Core 的 EntityFramework 6 与 mysql 数据库进行交互。

我很难尝试仅使用代码配置实体框架,而没有来自Web.config 的所有可用于“经典”.NET MVC 项目的配置。

我在尝试连接到数据库时遇到了超时(我可以在另一个依赖于 Web.config 的 API 中实现这一点,所以这绝对不是网络问题)。

我目前正在使用我的appsettings.json 文件中定义的 connectionString 实例化我的 DataContext:

  "Data": {
    "DefaultConnection": {
      "ConnectionString": "Server=db.example.com;Database=dbname;Uid=user;Pwd=123123;"
    }
  },

那么,在我的Startup.cs

        var connectionString = Configuration["Data:DefaultConnection:ConnectionString"];
        services.AddScoped((_) => new DataContext(connectionString));

另外,在DataContext.cs 中,我使用DbConfigurationType 装饰器设置自定义配置:

public class CodeConfig : DbConfiguration
{
    public CodeConfig()
    {
        SetDefaultConnectionFactory(new System.Data.Entity.Infrastructure.SqlConnectionFactory());
        SetProviderServices("System.Data.SqlClient",
            System.Data.Entity.SqlServer.SqlProviderServices.Instance);
        SetProviderServices("MySql.Data.MySqlClient", new MySql.Data.MySqlClient.MySqlProviderServices());

    }
}

我不是 100% 确定,但我认为问题在于我从未告诉 EntityFramework 它应该使用 mysql 提供程序,而且我完全不知道我应该如何做到这一点。

这是我得到的错误和堆栈的一部分:

SqlException:发生与网络相关或特定于实例的错误 在建立与 SQL Server 的连接时。服务器没有 找到或无法访问。验证实例名称是否正确 并且 SQL Server 配置为允许远程连接。 (提供者:命名管道提供者,错误:40 - 无法打开 连接到 SQL Server)

System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, object providerInfo, string newPassword, SecureString newSecurePassword, bool redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, DbConnectionPool pool, string accessToken, bool applyTransientFaultHandling, SqlAuthenticationProviderManager sqlAuthProviderManager)
System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, uint waitForMultipleObjectsTimeout, bool allowCreate, bool onlyOneCheckConnection, DbConnectionOptions userOptions, out DbConnectionInternal connection)
System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource<DbConnectionInternal> retry, DbConnectionOptions userOptions, out DbConnectionInternal connection)
System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource<DbConnectionInternal> retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, out DbConnectionInternal connection)
System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource<DbConnectionInternal> retry, DbConnectionOptions userOptions)
System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource<DbConnectionInternal> retry)
System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource<DbConnectionInternal> retry)
System.Data.SqlClient.SqlConnection.Open()
System.Data.Entity.Infrastructure.Interception.InternalDispatcher<TInterceptor>.Dispatch<TTarget, TInterceptionContext>(TTarget target, Action<TTarget, TInterceptionContext> operation, TInterceptionContext interceptionContext, Action<TInterceptor, TTarget, TInterceptionContext> executing, Action<TInterceptor, TTarget, TInterceptionContext> executed)
System.Data.Entity.Infrastructure.Interception.DbConnectionDispatcher.Open(DbConnection connection, DbInterceptionContext interceptionContext)
System.Data.Entity.SqlServer.SqlProviderServices+<>c__DisplayClass33.<UsingConnection>b__32()
System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy+<>c__DisplayClass1.<Execute>b__0()
System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute<TResult>(Func<TResult> operation)
System.Data.Entity.SqlServer.SqlProviderServices.UsingMasterConnection(DbConnection sqlConnection, Action<DbConnection> act)
System.Data.Entity.SqlServer.SqlProviderServices.CreateDatabaseFromScript(Nullable<int> commandTimeout, DbConnection sqlConnection, string createDatabaseScript)
System.Data.Entity.SqlServer.SqlProviderServices.DbCreateDatabase(DbConnection connection, Nullable<int> commandTimeout, StoreItemCollection storeItemCollection)
System.Data.Entity.Migrations.Utilities.DatabaseCreator.Create(DbConnection connection)
System.Data.Entity.Migrations.DbMigrator.EnsureDatabaseExists(Action mustSucceedToKeepDatabase)
System.Data.Entity.Migrations.DbMigrator.Update(string targetMigration)
System.Data.Entity.Internal.DatabaseCreator.CreateDatabase(InternalContext internalContext, Func<DbMigrationsConfiguration, DbContext, MigratorBase> createMigrator, ObjectContext objectContext)
System.Data.Entity.Database.Create(DatabaseExistenceState existenceState)
System.Data.Entity.CreateDatabaseIfNotExists<TContext>.InitializeDatabase(TContext context)
System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action)
System.Data.Entity.Internal.InternalContext.PerformDatabaseInitialization()
System.Data.Entity.Internal.RetryAction<TInput>.PerformAction(TInput input)
System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action<InternalContext> action)
System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
System.Data.Entity.Internal.Linq.InternalSet<TEntity>.Initialize()
System.Data.Entity.Internal.Linq.InternalSet<TEntity>.get_InternalContext()
System.Data.Entity.Infrastructure.DbQuery<TResult>.System.Linq.IQueryable.get_Provider()
System.Linq.Queryable.Where<TSource>(IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate)
Troco.ORM.Repository.UserRepository.GetUserInfoByLogin(string login) in UserRepository.cs

-- 更新--

将我的配置代码更改为:

    public class CodeConfig : DbConfiguration
    {
        public CodeConfig()
        {
            SetDefaultConnectionFactory(new MySql.Data.Entity.MySqlConnectionFactory());
            SetProviderServices("MySql.Data.MySqlClient", new MySql.Data.MySqlClient.MySqlProviderServices());

        }
    }

现在它似乎尝试使用 mysql 提供程序。但是,会发生此错误:

NotSupportedException:无法确定提供程序名称 'MySql.Data.MySqlClient.MySqlClientFactory' 类型的提供程序工厂。 确保 ADO.NET 提供程序已安装或注册到 应用程序配置。

【问题讨论】:

  • 想知道您是否从 MySQL 安装程序安装了 MySQL Connector/NET 功能。如果您尝试在 ASPNET-Core 项目中使用 non-web.config 路由,以下文档对此提供了快速参考:dev.mysql.com/doc/connector-net/en/…
  • @ajawad987 这成功了。我不能感谢你!我已经无数次浏览过该文件,但不知何故错过了它。如果其他人为此苦苦挣扎,那么您的连接器/网络、您的 Mysql.Data 和您的 Mysql.Data.Entity 都处于同一版本(在我的情况下是 6.10.8)也很重要。就是因为web.config下无法配置,所以需要安装另外一个软件

标签: c# mysql asp.net entity-framework-6


【解决方案1】:

正如@ajawad987 在他的评论中指出的那样,有必要下载并安装 Mysql Connector/NET 以使其在没有 web.config 文件的情况下工作。

https://dev.mysql.com/downloads/connector/net/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2022-06-14
    • 2017-03-12
    • 2016-11-02
    相关资源
    最近更新 更多