簡體   English   中英

“提供者沒有返回帶有Entity Framework的ProviderManifestToken字符串”MySQL

[英]“The provider did not return a ProviderManifestToken string” MySQL with Entity Framework

我在VS 2017中建立了一個新項目。我的目的是使用EF CodeFirst方法。 到目前為止,我使用的是Azure SQL數據庫,而在這個測試項目中我想使用我的遠程MySQL數據庫。 我創建了用戶並且權限設置恰到好處。 我可以通過MySQL Workbench訪問此遠程數據庫服務器。

我創建了一個新的空白MVC項目,並通過Nuget我安裝了MySQL.Data.Entity(版本6.9.10)。

我的Context類:

[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主機。 at MySql.Data.MySqlClient.NativeDriver.Open()at MySql.Data.MySqlClient.Driver.Open()at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings)at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection()at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver()at MySql.Data.MySqlClient.MySqlPool.GetConnection()at MySql.Data.MySqlClient.MySqlConnection.Open()at MySql System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection連接)中的.Data.MySqlClient.MySqlProviderServices.GetDbProviderManifestToken(DbConnection連接)---內部異常堆棧跟蹤結束---在System.Data.Entity.Core System.Data.Entity.Utilities.DbConnectionExtensions.GetProviderInfo中的MySql.Data.Entity.MySqlManifestTokenResolver.ResolveManifestToken(DbConnection連接)中的.Common.DbProviderServices.GetProviderManifestToken(DbConnection連接)(DbConnection連接,DbProviderManifest& 在System.Data.Entity.Empity.EreityModel(LazyInternalContext internalContext)上的System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)處於System.Data.Entity.Internal.RetryLazy 2.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
2.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
2.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.Migrations.DbMigrator中的System.Data.Entity.Utilities.DbContextExtensions.GetModel(DbContext context)。 System.Data.Entity.Migrations.Design.MigrationScaffolder..ctor上的System.Data.Entity.Migrations.DbMigrator..ctor(DbMigrationsConfiguration配置)中的.ctor(DbMigrationsConfiguration配置,DbContext usersContext,DatabaseExistenceState existState,Boolean calledByCreateDatabase)(DbMigrationsConfiguration migrationsConfiguration) )在System.Data.Entity.Migrations.Design.ToolingFacade.BandRunner.Run()的System.Data.Entity.Migrations.Design.ToolingFacade.ScaffoldRunner.RunCore()處提供者沒有重新
轉一個ProviderManifestToken字符串。

據我所知,我已經廣泛搜索到無濟於事。 這里發生了什么事? 我錯過了什么?

我最近遇到了和你一樣的問題。 一切都在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 []的問題。 我使用了以下文章中的變體來解決這個問題(希望如此!)。

使用EF Core和MySQL實現行版本的更好方法是什么?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM