【问题标题】:"The provider did not return a ProviderManifestToken string" MySQL with Entity Framework“提供者没有返回 ProviderManifestToken 字符串”带有实体框架的 MySQL
【发布时间】:2018-06-29 10:21:31
【问题描述】:

我在 VS 2017 中建立了一个新项目。我的意图是使用 EF CodeFirst 方法。到目前为止,我使用的是 Azure SQL 数据库,而在这个测试项目中,我想使用我的远程 MySQL 数据库。我已经创建了用户并且权限设置得恰到好处。我可以通过 MySQL Workbench 访问这个远程数据库服务器。

我创建了一个新的空白 MVC 项目,并通过 Nuget 安装了 MySQL.Data.Entity(版本 6.9.10)。

我的上下文类:

[DbConfigurationType(typeof(MySqlEFConfiguration))]
public class WebDb : DbContext
{
    public WebDb() : base("WebDb")
    {

    }

    public DbSet<Candidate> Candidates { get; set; }
}

我的 web.config 有这些条目:

<entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="mssqllocaldb" />
      </parameters>
    </defaultConnectionFactory>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <remove invariant="MySql.Data.MySqlClient" />
      <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
    </DbProviderFactories>
  </system.data>

我的连接字符串是:

<connectionStrings>
    <add name="WebDb" providerName="MySql.Data.MySqlClient" connectionString="server=x.x.x.x;uid=dbuser;pwd=password;database=temp1;" />
</connectionStrings>

我有一个简单的域类

public class Candidate
{
    public int Id { get; set; }
    public string Name { get; set; }
}

当我给出 Enable-Migrations -Force 命令时,我得到

正在检查上下文是否针对现有数据库... System.Data.Entity.Core.ProviderIncompatibleException:提供者 没有返回 ProviderManifestToken 字符串。 ---> MySql.Data.MySqlClient.MySqlException:无法连接到任何 指定的 MySQL 主机。在 MySql.Data.MySqlClient.NativeDriver.Open() 在 MySql.Data.MySqlClient.Driver.Open() 在 MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder 设置)在 MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() 在 MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() 在 MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() 在 MySql.Data.MySqlClient.MySqlPool.GetConnection() 在 MySql.Data.MySqlClient.MySqlConnection.Open() 在 MySql.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection 连接)在 System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection 连接)---内部异常堆栈跟踪结束---在 System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection 连接)在 MySql.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(DbConnection 连接)在 System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo(DbConnection 连接,DbProviderManifest&providerManifest) 在 System.Data.Entity.DbModelBuilder.Build(DbConnection 提供者连接)在 System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext 内部上下文)在 System.Data.Entity.Internal.RetryLazy2.GetValue(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
at System.Data.Entity.Internal.LazyInternalContext.get_ModelBeingInitialized() at System.Data.Entity.Infrastructure.EdmxWriter.WriteEdmx(DbContext context, XmlWriter writer) at System.Data.Entity.Utilities.DbContextExtensions.<>c__DisplayClass1.<GetModel>b__0(XmlWriter w) at System.Data.Entity.Utilities.DbContextExtensions.GetModel(Action
1 writeXml) 在 System.Data.Entity.Utilities.DbContextExtensions.GetModel(DbContext 上下文)在 System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration 配置、DbContext usersContext、DatabaseExistenceState 存在状态,布尔调用由创建数据库)在 System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration 配置)在 System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor(DbMigrationsConfiguration 迁移配置)在 System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore() 在 System.Data.Entity.Migrations.Design.ToolingFacade.BaseRunner.Run() 提供者未返回 ProviderManifestToken 字符串。

据我所知,我已经进行了广泛的搜索,但无济于事。这里发生了什么事?我错过了什么?

【问题讨论】:

    标签: mysql entity-framework-6


    【解决方案1】:

    我最近遇到了和你一样的问题。在 SQL Server 中一切正常,但我在转换到 MySQL 时遇到了很多问题。一些对我有用的事情是:

        Install-Package MySQL.Data -Version 6.9.9
        Install-Package MySql.Data.Entity -Version 6.9.10
    

    较新的 MySQL 8.0 包似乎有问题。当我恢复到旧版本时,它起作用了。

    您的 app.config 应如下所示:

          <dependentAssembly>
            <assemblyIdentity name="MySql.Data" publicKeyToken="c5687fc88969c44d" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-6.9.9.0" newVersion="6.9.9.0" />
          </dependentAssembly>
        </assemblyBinding>
      </runtime>
      <entityFramework>
        <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
        <providers>
          <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
          <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices, MySql.Data.Entity.EF6, Version=6.8.8.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d"></provider>
        </providers>
      </entityFramework>
      <system.data>
        <DbProviderFactories>
          <remove invariant="MySql.Data.MySqlClient" />
          <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
          <add name="MySQL Data Provider" invariant="MySql.Data.MySqlClient" description=".Net Framework Data Provider for MySQL" type="MySql.Data.MySqlClient.MySqlClientFactory, MySql.Data, Version=6.9.9.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
        </DbProviderFactories>
      </system.data>
    </configuration>
    

    即使在那之后,我也只是发现了 MySQL 中的一些差异。例如,您的迁移“索引”语句将不起作用。您必须自己编辑迁移文件并构建索引。我刚刚读到但没有遇到的另一件事是 MySQL 驱动程序不允许多个连接,这可能意味着更改检索异步集合的方式。最后,我遇到了 RowVersion 是 byte[] 的问题。我使用了以下文章的变体来解决这个问题(希望如此!)。

    Better way to implement a row version with EF Core and MySQL?

    【讨论】:

    • 我只想说这确实解决了我的问题。最新版本的 API 似乎存在问题。
    • 我的工作是 6.10.7。有人举报bugs.mysql.com/bug.php?id=91030
    • 战斗 2 小时后救了我
    • 附加信息:正在尝试 8.0.22 版本的 MySql.data - 如所述失败。切换到 6.9.12 的 MySql.Data 和 MySql.Data.Entity 清除了错误。很好的临时破解,直到找到真正的解决方案。 App.config 不包含“”标签,但在运行时提供它,这可能是它起作用的原因:string strProviderName = “MySql.Data.MySqlClient”; DbConnection dbConn = DbProviderFactories .GetFactory(strProviderName) .CreateConnection(); dbConn.ConnectionString = strConnectionString;
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2019-05-25
    • 2012-08-08
    • 2016-12-21
    • 2013-11-03
    相关资源
    最近更新 更多